Vue 之所以能在众多框架中脱颖而出,得益于它独特的设计理念和一系列优秀的特点。让我们深入了解这些特点。
这是 Vue 最核心的特性。当数据发生变化时,视图会自动更新,无需手动操作 DOM。
var vm = new Vue({
data: {
message: 'Hello'
}
})
// 修改数据
vm.message = 'World' // 视图自动更新
Vue 使用 Object.defineProperty 将 data 对象的所有属性转换为 getter/setter。当属性被读取时,收集依赖;当属性被修改时,通知依赖更新。
响应式的限制
Vue 2 的响应式系统有一些限制需要注意:
var vm = new Vue({
data: {
items: ['a', 'b', 'c']
}
})
// ❌ 直接通过索引修改数组,Vue 无法检测
vm.items[0] = 'x'
// ✅ 使用 Vue.set 或 $set
Vue.set(vm.items, 0, 'x')
vm.$set(vm.items, 0, 'x')
// ❌ 直接修改数组长度
vm.items.length = 0
// ✅ 使用 splice
vm.items.splice(0)
组件是 Vue 最强大的功能之一。它允许你将 UI 拆分成独立、可复用的代码片段。
Vue.component('my-component', {
template: '<div class="my-component">{{ message }}</div>',
data: function() {
return {
message: 'Hello from component'
}
},
methods: {
doSomething: function() {
console.log('doing something')
}
}
})
| 优势 | 说明 |
|---|---|
| 复用性 | 同一组件可在多处使用 |
| 封装性 | 组件内部状态对外隔离 |
| 可维护性 | 修改一个组件不影响其他组件 |
| 可测试性 | 组件可独立测试 |
Vue 支持使用 .vue 文件将模板、脚本、样式写在一起:
<template>
<div class="counter">
<button @click="decrement">-</button>
<span>{{ count }}</span>
<button @click="increment">+</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0
}
},
methods: {
increment() {
this.count++
},
decrement() {
this.count--
}
}
}
</script>
<style scoped>
.counter {
display: inline-flex;
align-items: center;
gap: 8px;
}
button {
width: 32px;
height: 32px;
}
</style>
Vue 使用虚拟 DOM 来优化渲染性能。
虚拟 DOM 是用 JavaScript 对象描述真实 DOM 结构:
// 虚拟 DOM 节点
{
tag: 'div',
data: {
class: 'container'
},
children: [
{
tag: 'span',
text: 'Hello'
}
]
}
直接操作 DOM 是昂贵的。虚拟 DOM 的优势:
Vue 的 diff 算法采用同层比较策略:
旧树 新树
┌─────┐ ┌─────┐
│ A │ │ A │ ← 同层比较
├─────┤ ├─────┤
│ B │ vs │ C │ ← 同层比较
├─────┤ ├─────┤
│ C │ │ B │ ← 同层比较
└─────┘ └─────┘
只比较同一层级的节点,不跨层级比较,时间复杂度从 O(n³) 降到 O(n)。
Vue 使用基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定到底层实例的数据。
<!-- 文本 -->
<span>{{ message }}</span>
<!-- HTML(注意 XSS 风险) -->
<span v-html="rawHtml"></span>
<!-- 属性 -->
<div v-bind:id="dynamicId"></div>
指令是带有 v- 前缀的特殊属性:
<!-- 条件渲染 -->
<p v-if="seen">现在你看到我了</p>
<!-- 列表渲染 -->
<li v-for="item in items">{{ item.name }}</li>
<!-- 事件绑定 -->
<button v-on:click="doSomething">点击</button>
<!-- 双向绑定 -->
<input v-model="message">
Vue 的核心库非常小:
| 版本 | 大小(min+gzip) |
|---|---|
| 运行时 | 约 23KB |
| 完整版 | 约 30KB |
相比之下:
轻量级意味着更快的加载速度和更低的带宽消耗。
Vue 有完善的官方生态系统:
| 库 | 用途 |
|---|---|
| Vue Router | 路由管理 |
| Vuex | 状态管理 |
| Vue CLI | 项目脚手架 |
| Vue DevTools | 浏览器调试工具 |
官方维护的好处是版本同步、文档统一、质量有保障。
Vue 的学习曲线相对平缓:
Vue 的核心特点可以概括为:
这些特点使得 Vue 成为构建现代 Web 应用的优秀选择。在接下来的章节中,我们将深入探讨每个特性的具体用法。