跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

Vue 核心语法与原理实战指南

Vue 基于 MVVM 架构实现数据驱动视图,通过双向绑定简化 DOM 操作。本文涵盖实例创建、模板语法、指令系统(v-bind/v-model/v-if 等)、事件处理、计算属性与侦听器、生命周期及响应式原理。重点讲解 Object.defineProperty 数据劫持机制与虚拟 DOM 优化策略,提供表单收集、样式绑定等实战案例,适合初学者构建完整知识体系。

古灵精怪发布于 2026/4/7更新于 2026/5/2413 浏览
Vue 核心语法与原理实战指南

Vue 核心语法与原理实战指南

1. Vue 简介与 MVVM 架构

Vue 的核心设计理念是数据驱动视图。通过单向或双向数据绑定,当页面数据发生变化时,视图会自动重新渲染,开发者无需手动操作 DOM。

1.1 数据绑定模式

  • 单向数据绑定:数据流向是从 Model 到 View。当数据变化时,页面自动更新。
  • 双向数据绑定:在表单交互中,用户输入的内容会自动同步到数据源,反之亦然。

1.2 MVVM 分层思想

MVVM 将应用分为三个部分:

  • Model(模型):数据层。
  • View(视图):UI 层。
  • ViewModel(视图模型):连接 Model 和 View 的桥梁。

VM 负责处理脏活累活。当 Model 改变时,VM 自动更新 View;当 View 改动时,VM 自动更新 Model。这极大地提高了开发效率,减少了冗余的 DOM 操作代码。

<!-- 准备容器 -->
<div id="app">
  姓名:<input type="text" v-model="name">
</div>

<script>
  const vm = new Vue({
    el: '#app',
    data: {
      name: 'zhangsan'
    }
  })
</script>

2. 第一个 Vue 程序

引入 Vue.js 后,它会被注册为全局变量。首先需要 new 一个 Vue 实例。

2.1 实例配置项 (options)

Vue 实例接收一个配置对象,其中包含各种选项。例如 template、data、el 等。

const myVue = new Vue({
  template: '<h1>Hello World!</h1>'
})
myVue.$mount('#app') // 手动挂载实例

2.2 模板挂载

  • $mount() 方法:将编译后的 HTML 渲染到指定位置。注意:指定位置的元素会被替换。
  • el 配置项:直接指定 Vue 实例关联的容器 ID 或选择器,效果等同于 $mount()。

2.3 数据来源:data

data 选项提供模板语句的数据支持。它可以是对象或函数。如果是对象,必须是纯粹的对象(Key/Value 对)。数据通过插值语法 {{ }} 插入模板。

new Vue({
  template: `<h1>{{ name }} 开始学 Vue!! {{ lead.age }} 岁的 {{ lead.name }} 也在学习!!</h1>`,
  data: {
    name: '张三',
    releaseTime: '2025 年 8 月 2 日',
    lead: { name: '高齐强', age: 40 },
    classmates: [
      { name: '李四', age: 18 },
      { name: '王五', age: 80 }
    ]
  }
}).$mount('#app')

注意:只要 data 中的数据发生变化,模板语句一定会重新编译并渲染。建议将多行模板代码写在反引号 ` 中,避免使用字符串拼接。

3. Vue 核心语法

3.1 插值表达式

在 {{ }} 中可以写合法的 JavaScript 表达式,包括变量、常量、三元运算符等。但表达式被放在沙盒中运行,只能访问全局变量的白名单(如 Math, Date 等)。

<h1>{{ msg }}</h1>
<h1>{{ sayHello() }}</h1>
<h1>{{ gender ? '男' : '女' }}</h1>
<h1>{{ Date.now() }}</h1>

3.2 指令系统

指令以 v- 开头,用于响应式地作用于 DOM。它们通常作为 HTML 属性存在。

3.2.1 条件渲染
  • v-if:动态创建或移除 DOM 元素。适合不频繁切换的场景。
  • v-show:通过 CSS display 控制显示隐藏。适合频繁切换的场景。
  • v-else / v-else-if:配合 v-if 使用,中间不能断开。
<div v-if="a <= b">测试通过</div>
<div v-show="false">你可以看到我吗?</div>
<span v-if="temp <= 10">寒冷</span>
<span v-else-if="temp <= 25">凉爽</span>
<span v-else>炎热</span>
3.2.2 属性绑定:v-bind

用于动态设置 HTML 属性。简写形式为冒号 :。

<img :src="imgPath">
<input :value="username">
<a :href="url">链接</a>

提示:标签体内的内容动态用插值 {{ }},标签属性的动态用指令 :。

3.2.3 双向绑定:v-model

主要用于表单元素(input, select, textarea),实现数据的双向绑定。

<!-- 简写 -->
<input type="text" v-model="name">
<!-- 等价于 -->
<input type="text" :value="name" @input="name = $event.target.value">
3.2.4 列表渲染:v-for

遍历数组、对象或字符串。建议使用唯一标识(如 id)作为 key,而非索引 index,以避免更新时的性能问题和状态错乱。

<ul>
  <li v-for="(vip, index) of vips" :key="vip.id">
    {{ vip.name }} - {{ vip.age }}
  </li>
</ul>
3.2.5 其他指令
  • v-text:更新元素的文本内容,覆盖原有内容。
  • v-html:解析并渲染 HTML 内容(注意 XSS 风险)。
  • v-cloak:防止闪烁,加载完成后移除。
  • v-pre:跳过编译,提高性能。
  • 自定义指令:可通过 directives 选项定义局部或全局指令。

4. 事件处理

使用 v-on 或 @ 绑定事件回调。回调函数需定义在 methods 选项中。

<button @click="sayHi($event, 'jack')">点击</button>
methods: {
  sayHi(event, name) {
    console.log(name, event)
  }
}

4.1 事件修饰符

  • .stop:阻止事件冒泡。
  • .prevent:阻止默认行为。
  • .capture:使用捕获模式。
  • .self:仅当事件在该元素自身触发时执行。
  • .once:只触发一次。

4.2 按键修饰符

支持 .enter, .tab, .delete, .esc 等常用键名,也可自定义键码映射。

5. 计算属性与侦听器

5.1 计算属性 (computed)

计算属性本质是属性,具有缓存机制。只有依赖的数据变化时才会重新计算。

computed: {
  reversedInfo() {
    return this.info.split('').reverse().join('')
  }
}

5.2 侦听器 (watch)

适用于监听数据变化并执行异步操作或开销较大的操作。支持深度监听 (deep) 和立即执行 (immediate)。

watch: {
  number: {
    handler(newValue, oldValue) {
      console.log(newValue, oldValue)
    },
    immediate: true,
    deep: true
  }
}

6. 样式绑定

6.1 Class 绑定

  • 字符串:<div :class="c1"></div>
  • 数组:<div :class="[c1, c2]"></div>
  • 对象:<div :class="{active: isActive}"></div>

6.2 Style 绑定

支持对象形式(驼峰命名)和数组形式。

<div :style="{ backgroundColor: 'gray' }"></div>
<div :style="styleArray"></div>

7. 表单数据收集

结合 v-model 和修饰符(.trim, .number, .lazy)可高效收集表单数据。

<form @submit.prevent="send">
  <input v-model.trim="user.username">
  <input type="number" v-model.number="user.age">
  <select v-model="user.grade">
    <option value="zk">专科</option>
    <option value="bk">本科</option>
  </select>
  <textarea v-model.lazy="user.introduce"></textarea>
  <button>提交</button>
</form>

8. 响应式原理与数据劫持

Vue 2 使用 Object.defineProperty 实现数据劫持。通过 getter 和 setter 拦截属性的读取和修改,从而触发视图更新。

8.1 数据代理

Vue 实例通过代理机制,使得 vm.msg 实际上访问的是 vm._data.msg。以 _ 或 $ 开头的属性不会被代理,以避免与框架内部属性冲突。

8.2 数组响应式

直接修改数组下标不会触发更新。应使用 Vue 提供的变异方法(push, pop, splice 等)或 Vue.set / this.$set。

// 正确
vm.users.push('newUser')
Vue.set(vm.vips, 0, 'modified')

// 错误
vm.users[0] = 'newName'

9. Vue 生命周期

了解生命周期钩子有助于在合适的时机执行逻辑。

  • beforeCreate / created:实例创建阶段。created 中可访问数据,常用于 API 请求。
  • beforeMount / mounted:挂载阶段。mounted 中可操作 DOM,常用于集成第三方库。
  • beforeUpdate / updated:更新阶段。数据变更导致虚拟 DOM 重新渲染。
  • beforeDestroy / destroyed:销毁阶段。用于清理定时器、取消订阅等。
export default {
  created() {
    console.log('实例已创建,数据可用')
  },
  mounted() {
    console.log('DOM 已挂载')
  },
  beforeDestroy() {
    clearInterval(this.timer)
  }
}

10. 总结

Vue 通过简洁的语法和强大的功能简化了前端开发。掌握其核心语法、指令系统及底层原理,能够帮助开发者构建高效、可维护的单页应用。在实际项目中,合理运用计算属性、侦听器和生命周期钩子,能显著提升用户体验和代码质量。

目录

  1. Vue 核心语法与原理实战指南
  2. 1. Vue 简介与 MVVM 架构
  3. 1.1 数据绑定模式
  4. 1.2 MVVM 分层思想
  5. 2. 第一个 Vue 程序
  6. 2.1 实例配置项 (options)
  7. 2.2 模板挂载
  8. 2.3 数据来源:data
  9. 3. Vue 核心语法
  10. 3.1 插值表达式
  11. 3.2 指令系统
  12. 3.2.1 条件渲染
  13. 3.2.2 属性绑定:v-bind
  14. 3.2.3 双向绑定:v-model
  15. 3.2.4 列表渲染:v-for
  16. 3.2.5 其他指令
  17. 4. 事件处理
  18. 4.1 事件修饰符
  19. 4.2 按键修饰符
  20. 5. 计算属性与侦听器
  21. 5.1 计算属性 (computed)
  22. 5.2 侦听器 (watch)
  23. 6. 样式绑定
  24. 6.1 Class 绑定
  25. 6.2 Style 绑定
  26. 7. 表单数据收集
  27. 8. 响应式原理与数据劫持
  28. 8.1 数据代理
  29. 8.2 数组响应式
  30. 9. Vue 生命周期
  31. 10. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • DeepSeek 隐藏玩法与高阶提示词使用指南
  • 2026 GitHub 热门 Python 项目:AI 代理与数据工具
  • OpenClaw 新手指南:AI 机器人搭建与配置
  • C++ 手写红黑树:深入理解 STL map 底层结构
  • Ubuntu 25.04 安装向日葵远程桌面详细教程
  • Linux 系统安装 libwebkit2gtk-4.1-0 实战指南
  • 前端岗位面试高频原题与参考答案
  • AIGC 时代的网络安全威胁与应急响应机制构建
  • Vivado 许可证获取与配置指南
  • 10 分钟构建自动化工作流:Webhook 实战指南
  • Mintlify AI 自动化文档生成工具实操指南
  • 飞书 OpenClaw 接入指南:无需服务器通过长连接运行机器人
  • AI 领域今日动态:NVIDIA GTC 发布 GR00T N2 与 Claude Code 上下文突破
  • 二叉搜索树:概念、性能与实现
  • VSCode 接入智谱 GLM-4 及自定义大模型配置方案
  • WebLaTeX:基于 VSCode 的在线 LaTeX 编辑器
  • Android WebView 内核升级方案详解与实战
  • Dify Docker 离线部署指南:从镜像打包到无网环境部署
  • FastAPI:Python 高性能 Web 框架的优雅之选
  • LangChain 技术解析:学习难点、版本演进与国产模型集成实践

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online