Vue 技术文档
简介:Vue 是什么?
Vue 是一个用于构建用户界面的渐进式 JavaScript 框架。Vue 可以自底向上逐层应用,逐步引入,不需要一开始就重构整个应用。
核心概念
组件化
Vue 将页面的 HTML、CSS 和 JS 代码封装在一个组件中,可以被其他组件或页面重复使用。组件化能够有效地将一个庞大复杂的前端工程拆分成一个个独立的、可重复使用的组件,大大提高了开发效率。
声明式编码
命令式:
声明式:
1 2
| <div>{{ message }}</div>
|
虚拟 DOM 和 DIFF 算法
Vue 使用虚拟 DOM 来优化 DOM 操作,避免了频繁的直接操作 DOM,提升了性能。通过 DIFF 算法,Vue 只会更新变动的部分,进一步提高了渲染效率。
生命周期
Vue 实例会经历一系列生命周期钩子函数,开发者可以在这些钩子函数中插入自定义代码。例如:created
、mounted
、updated
等。
MVVM 模型
- M (Model):模型层,通常指
data
数据
- V (View):视图层,通常指模板
- VM (ViewModel):视图模型,即 Vue 实例对象,负责将模型与视图进行绑定
通过数据绑定和 DOM 监听,Vue 实现了视图与数据的双向绑定。
优缺点
优点
- 组件化开发:易于维护和复用。
- 响应式数据绑定:自动更新视图。
- 虚拟 DOM:提高性能。
- 渐进式框架:可以逐步集成。
缺点
- 学习曲线:对于初学者来说可能需要一定时间理解 Vue 的响应式原理。
- 不适合非常复杂的应用:当应用非常庞大时,性能和维护性可能会遇到问题。
语法
基本结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| new Vue({ el: "#app", data: { message: "Hello Vue!", }, computed: { name: { getter() { return this.message; }, setter(value) { this.message = value; }, }, }, methods: { fname() { }, }, watch: { message(newVal, oldVal) { console.log(`Message changed from ${oldVal} to ${newVal}`); }, }, });
|
计算属性简写
1 2 3 4 5
| computed: { fname() { } }
|
模板语法
插值语法
指令语法
1
| <a v-bind:href="url">Click me</a>
|
1
| <input v-model="message" />
|
简写:
1
| <input v-model="message" />
|
1
| <button v-on:click="clickHandler">Click me</button>
|
简写:
1
| <button @click="clickHandler">Click me</button>
|
1
| <div v-show="isVisible">This is visible</div>
|
Vue 实例的挂载
1 2 3
| const v = new Vue({ el: "#app", });
|
简写:
方法
事件处理
1 2 3
| <ul @wheel="handleWheel"> <li></li> </ul>
|
1 2 3
| <ul @scroll="handleScroll"> <li></li> </ul>
|
属性添加与配置可枚举
1 2 3 4 5 6
| Object.defineProperty(object, "key", { value: 42, enumerable: true, writable: true, configurable: true, });
|
methods 中函数传参
1
| <button @click="fname($event, 'param')">Click</button>
|
1 2 3 4 5
| methods: { fname(event, param) { } }
|
监视器
监视属性变化
1 2 3 4 5
| watch: { message(newValue, oldValue) { console.log(`Message changed from ${oldValue} to ${newValue}`); } }
|
简写:
1 2 3 4 5
| watch: { message(newValue) { console.log(newValue); } }
|
深度监视
1 2 3 4 5 6 7 8
| watch: { data: { deep: true, handler(newValue, oldValue) { } } }
|
事件修饰符
1
| <a href="#" @click.prevent="handleClick">Click me</a>
|
1 2 3
| <div @click.stop="handleClick"> <button @click.stop="handleClick">Click me</button> </div>
|
1
| <button @click.once="handleClick">Click me</button>
|
1
| <div @click.capture="handleClick">Click me</div>
|
self
:只有 event.target
是当前元素时才触发事件
1
| <button @click.self="handleClick">Click me</button>
|
键盘事件
1
| <input @keyup.enter="handleEnter" />
|
1
| <input @keyup.space="handleSpace" />
|
class 和 style 绑定
class 绑定
1
| <div :class="className">Content</div>
|
1
| <div :class="['class1', 'class2']">Content</div>
|
style 绑定
1
| <div :style="{ fontSize: fontSize + 'px' }">Content</div>
|