文章目录
快速上手
Vue 是什么
Vue 是一个用于 构建用户界面的渐进式框架,极大提升开发效率
Vue 的两种使用方式:
- Vue 核心包开发,适用于局部模块改造
- Vue 核心包 & Vue 插件 工程化开发,适用于整站开发

创建 Vue 实例
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
</head>
<body>
<!--
创建Vue实例,初始化渲染
1.准备容器(Vue所管理的范围)
2.引包(开发版本包 / 生产版本包)
3.创建实例
4.添加配置项 => 完成渲染 -->
<div id="app">
{{ msg }}
</div>
<script>
const app = new Vue({
// 通过el配置选择器,制定Vue管理的是哪个盒子
el: '#app',
// 通过data提供渲染的数据
data: {
msg: 'Hello World'
}
})
</script>
</body>
</html>
插值表达式
插值表达式是一种 Vue 的模板语法,利用表达式进行插值,渲染到页面中
表达式:是可以被求值的代码,JS引擎会将其计算出一个结果
语法:{{ 表达式 }}
注意:
1.使用的数据必须存在 (data)
2.支持的是表达式,而非语句,比如:if for
3.不能在标签属性中使用 {{ }} 插值,例如<div name="{{ username }}"></div>
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<p>{{ nickname }}</p>
<p>{{ nickname.toUpperCase() }}</p>
<p>{{ nickname + 'hello'}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
nickname: 'tony'
}
})
</script>
</body>
</html>
响应式特性
数据改变,视图会自动更新,使用 Vue 开发,关注业务的核心逻辑,根据业务修改数据即可

开发者工具
安装 Vue 开发者工具Chrome浏览器插件,调试 Vue 应用

打开 Vue 运行的页面,调试工具中 Vue 栏,即可查看修改数据,进行调试。

指令
Vue 会根据不同的【指令】,针对标签实现不同的【功能】
指令:带有 v- 前缀的特殊标签属性
常用指令
| 指令 | 用途说明 | 示例 |
|---|---|---|
| v-text | 更新元素的文本内容(等价于 {{}} 插值,但不解析 HTML) | <span v-text="msg"> |
| v-html | 更新元素的 innerHTML(注意 XSS 风险) | <div v-html="htmlContent"></div> |
| v-show | 根据表达式切换元素的 display CSS 属性(始终渲染 DOM) | <div v-show="isVisible">Hello</div> |
| v-if / v-else-if / v-else | 条件性地渲染元素(为 false 时不渲染 DOM) | <div v-if="type === 'A'">A</div><div v-else>B</div> |
| v-for | 基于源数据多次渲染元素或组件(支持数组、对象、数字) | <li v-for="(item, index) in items" :key="item.id">{{ item.name }}</li> |
| v-on(简写 @) | 绑定事件监听器 | <button @click="handleClick">Click</button> |
| v-bind(简写 :) | 动态绑定 HTML attribute 或组件 prop | <img :src="imageUrl" :alt="imageAlt"> |
| v-model | 在表单控件或组件上创建双向数据绑定 | <input v-model="message"> |
| v-pre | 跳过该元素及其子元素的编译(用于显示原始 Mustache 标签) | <span v-pre>{{ this will not be compiled }}</span> |
| v-cloak | 保持在元素上直到关联实例结束编译(常配合 CSS 隐藏未编译模板) | <div v-cloak>{{ message }}</div> |
| v-once | 只渲染元素和组件一次(后续更新不再响应) | <span v-once>{{ msg }}</span> |
指令修饰符
通过指令修饰符可实现一些处理,简化代码
v-on(事件)修饰符
| 修饰符 | 作用 | 示例 |
|---|---|---|
| .stop | 阻止事件冒泡(等价于 event.stopPropagation()) | <div @click.stop="doThis"></div> |
| .prevent | 阻止默认行为(等价于 event.preventDefault()) | <form @submit.prevent="onSubmit"></form> |
| .capture | 在捕获阶段触发事件处理函数 | <div @click.capture="doThis">...</div> |
| .self | 只有当事件是从该元素本身触发时才触发回调 | <div @click.self="doThis">... </div> |
| .once | 事件只触发一次 | <button @click.once="doThis"> </button> |
| .passive | 表示事件处理器不会调用 preventDefault()(提升滚动性能) | <div @scroll.passive="onScroll"> </div> |
可链式使用:@click.stop.prevent="handler"
v-model(表单)修饰符
| 修饰符 | 作用 | 示例 |
|---|---|---|
| .lazy | 将输入同步从 input 事件改为 change 事件(失焦或回车时更新) | <input v-model.lazy="msg"> |
| .number | 自动将用户输入转为 Number 类型(若无法转换则返回原字符串) | <input v-model.number="age"> |
| .trim | 自动去除用户输入的首尾空白 | <input v-model.trim="name"> |
注意:.number 不会把空字符串转成 0,而是保留为空字符串。
v-bind 相关(Vue 3 新增)
| 修饰符 | 作用 | 示例 | 版本 |
|---|---|---|---|
| .prop | 强制绑定为 DOM property(而非 attribute) | <div v-bind.prop="someObject"> | Vue 2 支持 |
| .attr | 显式绑定为 HTML attribute(Vue 3.2+) | <div v-bind.attr="attrs"> | Vue 3.2+ |
实际开发中较少手动使用 .prop / .attr,多数情况 Vue 会自动判断。
键盘事件修饰符(用于 v-on)
| 修饰符 | 作用 | 示例 |
|---|---|---|
| .enter | 回车键 | <input @keyup.enter="submit"> |
| .tab | Tab 键 | <input @keydown.tab="onTab"> |
| .delete | 捕获"删除"和"退格"键 | <input @keyup.delete="clear"> |
| .esc | Esc 键 | <div @keyup.esc="close"> |
| .space | 空格键 | <button @keydown.space="pause"> |
| .up / .down / .left / .right | 方向键 | <input @keydown.up="moveUp"> |
也可使用按键码(Vue 2 支持,Vue 3 已废弃);推荐使用上述别名。
可组合使用:@keyup.enter.exact(仅 Enter,不包含其他修饰键)
系统修饰键(用于 v-on)
用于检测是否按下了特定系统键(如 Ctrl、Alt 等):
| 修饰符 | 作用 | 示例 |
|---|---|---|
| .ctrl | Ctrl 键 | <input @keyup.ctrl.enter="submit"> |
| .alt | Alt 键 | <button @click.alt="doSomething"> |
| .shift | Shift 键 | <input @click.shift="selectRange"> |
| .meta | Meta 键(Mac 上是 ⌘,Windows 上是 Win 键) | <input @keyup.meta.s="save"> |
| .exact | 仅当按下指定键、无其他键时才触发 | <button @click.exact="onlyClick"> |
提示:在 Vue 3 中,所有事件修饰符的行为与 Vue 2 基本一致,但移除了对数字 keyCode 的支持。
v-bind 对于样式控制的增强
操作class
| 绑定方式 | 语法示例 | 特点 | 适用场景 |
|---|---|---|---|
| 对象语法 | :class="{ active: isActive, 'text-danger': hasError }" | 按布尔值动态开关类名 | 条件切换样式(如激活、错误状态) |
| 数组语法 | :class="[activeClass, errorClass]" 或 :class="[{ active: isActive }, baseClass]" | 组合多个类,可嵌套对象 | 多个确定类 + 部分条件类 |
| 字符串/变量 | :class="classString" (classString: 'active text-danger') | 直接绑定完整类字符串 | 简单场景,灵活性低(不推荐复杂逻辑) |
操作style
js
v-bind:style="{ css属性名1: css属性值1, css属性名2: css属性值2}"
计算属性
基础语法
基于现有的数据,计算出来的新属性。依赖的数据变化,自动重新计算。
语法:
- 声明在computed 配置项中,一个计算属性对应一个函数
- 使用起来和普通属性一样使用 {{ 计算属性名}}
计算属性→ 可以将一段求值的代码进行封装
js
const app = new Vue({
el: '#app',
data: {
list: [
{id: 1, name: '篮球1', num: 1},
{id: 2, name: '篮球2', num: 2},
{id: 3, name: '篮球3', num: 3}
]
},
computed: {
// totalCount() {
// let total = this.list.reduce((sum, item) => sum+item.num , 0)
// return total
// }
// 完整写法
totalCount: {
get() {
let total = this.list.reduce((sum, item) => sum+item.num , 0)
return total
},
set(value) {
console.log('set');
}
}
}
})
计算属性与方法
computed 计算属性
作用:封装了一段对于数据的处理,求得一个结果。计算属性会对计算出来的结果缓存,再次使用直接读取缓存,依赖项变化了,会自动重新计算→ 并再次缓存
语法:
- 写在computed配置项中
- 作为属性,直接使用→ this.计算属性、 {{ 计算属性 }}
methods 方法
作用:给实例提供一个方法,调用以处理业务逻辑。
语法:
- 写在methods 配置项中
- 作为方法,需要调用 → this.方法名( ) 、 {{ 方法名() }} 、 @事件名="方法名"
监听器
监听器用于监视数据变化,执行一些业务逻辑或异步操作。
语法:
- 简单写法 → 简单类型数据,直接监视
- 完整写法 → 添加额外配置项
js
const app = new Vue({
el: '#app',
data: {
words: '',
obj: {
words: ''
}
},
watch: {
// 简单写法
// 属性名(newValue, oldValue)
// '对象.属性名'(newValue, oldValue)
// 'obj.words'(newValue, oldValue) {
// console.log(newValue, oldValue);
// },
// 完整写法
obj: {
deep: true, // 对复杂类型深度监视
immediate: true, // 初始化立刻执行一次handler方法
handler(newValue, oldValue) {
console.log(newValue["words"], oldValue["words"]);
}
}
}
})
生命周期
四个阶段
Vue生命周期:一个Vue实例从创建到销毁的整个过程
生命周期四个阶段:①创建 ②挂载 ③更新 ④销毁

生命周期函数

js
const app = new Vue({
el: '#app',
data: {
count: 100
},
// 1.创建阶段(准备数据)
beforeCreate() {
console.log('响应式数据准备好之前', this.count);
},
// 2.渲染阶段
created() {
console.log('响应式数据准备好之后', this.count);
},
beforeMount() {
console.log('模板渲染好之前');
},
mounted() {
console.log('模板渲染好之后');
},
// 3.更新阶段
beforeUpdate() {
console.log('beforeUpdate');
},
updated() {
console.log('updated');
},
//4.销毁阶段
beforeDestroy() {
console.log('beforeDestroy');
} ,
destroyed() {
console.log('destroyed');
}
})