一、插值表达式
- 数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值;
- 作用:
- 表达式:
- 可以被求值,凡是有结果的操作;
- 字面量;
- 对象.属性名;
- 算术运算;
- 三元表达式;
- 方法的调用;
- 语法:
<标签> {{ 表达式 }} </标签>
- ❗ 注意:
- 单标签不能使用;
- Vue数据变量要在
<script>中的 data函数 的 返回对象 中声明;
- 双大括号之间只能写表达式(上面说的五种);
- “Mustache”语法会将数据解释为普通文本:
- “Mustache”语法不能作用在 HTML attribute上,遇到这种情况应该使用指令;
- 代码展示:
<template>
<div>
<h1>{{ msg }}</h1>
<p>我叫{{ obj.name }},今年{{ obj.age }}岁了</p>
<p>明年我就{{ obj.age + 1 }}岁了</p>
<p>我目前是{{ obj.age >= 18 ? "成年" : "未成年" }}</p>
<p>msg由{{ msg.split(",").length }}个单词组成</p>
</div>
</template>
<script>
export default {
data() {
return {
msg: "Hello, Vue2!",
obj: {
name: "小vue",
age: 7
}
};
},
};
</script>
二、Vue指令
- 什么是指令?
- 指令是带有
v- 前缀的特殊属性。指令的属性的值预期是 单个 JavaScript 表达式(v-for是例外情况);
- 指令的职责是什么?
- 当表达式的值改变时,将其产生的连带影响,响应式地作用于DOM;
2.1 v-bind
- 作用:
- 语法:
- 示例展示:
<template>
<div>
<a :href="url">点击去B站</a>
<a :href="gitee">
<img :src="img.urlImg" :title="img.title" />
</a>
</div>
</template>
<script>
export default {
data() {
return {
url: "https://www.bilibili.com/",
gitee: "https://gitee.com/",
img: {
urlImg: "https://gitee.com/static/images/logo-black.svg?t=158106664",
title: "点击去Gitee",
}
};
},
};
</script>
2.2 v-on
- 语法:

- 注意:
- data函数 会把 return 的 对象 挂载 到 当前 组件实例 上;
- 事件处理函数中的 this 指向 组件实例:
this 包含了 data 中所有的 数据属性 和 methods中的方法;
- 因此我们可以通过
this 访问 data 中的任何一个数据属性和methods中的任何方法;
- 如果是写在 标签 上,
this 可以 省略;
- ❗ 关于 this 的注意事项:
- 在开发中我们,我们有时候需要在
mounted钩子函数中监听页面尺寸变等等,此时resize的事件注册方式有两种,一种是使用addEventListener去注册,还有一种就是直接使用window.onresize = xxx这种方式去注册,在这里事件处理函数的声明需要格外的注意:
- 如果事件处理函数不是箭头函数的话,在事件处理函数内部不能使用
this关键字(此时的this指的是事件处理函数内部的this),我们可以在声明一个变量_this,将this的值赋值给_this,然后通过_this访问数据属性或者方法;
- 如果事件处理函数使用的是箭头函数,那么就可以正常使用
this不受影响;
- 关于此处的【事件对象、事件修饰符、按键修饰符、系统修饰符等 可见 本篇第八节】;
- 实例展示:
<template>
<div>
<h4>您购买的商品数量:{{ count }}</h4>
<button v-on:click="count++">+1</button>
<button v-on:click="add">+5</button>
<button v-on:click="addFn(10)">+10</button>
<button @click="count--">-1</button>
<button @click="minus">-5</button>
<button @click="minusFn(10)">-10</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0,
};
},
methods: {
add() {
this.count += 5;
},
addFn(num) {
this.count += num;
},
minus() {
this.count -= 5;
},
minusFn(num) {
this.count -= num;
},
},
};
</script>
2.3 v-model
2.3.1 基本语法
- 作用:
- 将 value属性 和 Vue数据属性 进行 双向绑定;
- 语法:
v-mdoel="Vue数据属性"
- 示例展示:
<template>
<div>
<label for="text">用户名:</label>
<input v-model="text" type="text" id="text" /> <br />
<label for="pwd">密码:</label>
<input v-model="pwd" type="password" id="pwd" /> <br />
<select v-model="city" name="" id="">
<option value="武汉">武汉</option>
<option value="杭州">杭州</option>
<option value="深圳">深圳</option>
<option value="浙江">浙江</option>
</select>
<br />
<textarea v-model="txt" name="" id="" cols="30" rows="10"></textarea>
<p>
<span>性别:</span>
<label for="man">男</label>
<input v-model="sex" value="男" type="radio" name="sex" id="man" />
<label for="woman">女</label>
<input v-model="sex" value="女" type="radio" name="sex" id="woman" />
</p>
<p>
<input v-model="deal" type="checkbox" name="" id="deal" />
<label for="deal">同意商家协议</label>
</p>
<p>
爱好:
<label for="wuhan">武汉</label>
<input v-model="city" value="武汉" type="checkbox" name="" id="wuhan" />
<label for="hangzhou">杭州</label>
<input
v-model="city"
value="杭州"
type="checkbox"
name=""
id="hangzhou"
/>
<label for="shanghai">上海</label>
<input
v-model="city"
value="上海"
type="checkbox"
name=""
id="shanghai"
/>
<label for="zhejiang">浙江</label>
<input
v-model="city"
value="浙江"
type="checkbox"
name=""
id="zhejiang"
/>
</p>
</div>
</template>
<script>
export default {
data() {
return {
text: "",
pwd: "",
city: "武汉",
txt: "",
sex: "",
deal: "",
city: [],
};
},
};
</script>
2.3.2 修饰符
| 修饰符 | 作用 |
|---|
.number | 尝试调用 parseFloat() 去将字符串转为数字,能转就转,不能转 |
.trim | 去除 首尾 空白符 |
.lazy | 内容改变的同时又失去焦点,在 change 触发时 而非 input |
- 示例展示:
<template>
<div>
<div>
<span>年龄:</span>
<input type="text" v-model.number="age" name="" id="" />
</div>
<div>
<span>人生格言:</span>
<input type="text" v-model.trim="motto" name="" id="" />
</div>
<div>
<span>自我介绍:</span>
<textarea
v-model.lazy="intro"
name=""
id=""
cols="30"
rows="10"
></textarea>
</div>
</div>
</template>
<script>
export default {
data() {
return {
age: "",
motto: "",
intro: "",
};
},
};
</script>
2.3.3 v-model语法糖
- 这里就举个简单的例子来说明:
- 以
input输入框为例;
- 标签上绑定
input事件,在input事件的事件处理函数内,将value属性的值赋值给vue数据属性;
- 在标签上使用
v-bind指令给input的value属性绑定Vue数据属性;
- 注意:
- v-model的内部为不同的输入元素使用不同的属性并抛出不同的事件
- text和textarea元素使用 value属性和input事件
- checkbox和radio使用checked和change事件
2.4 v-text 和 v-html
2.5 v-show 和 v-if
2.5.1 基础用法
2.5.2 ❌ v-if的高级用法
- 首先,在开发中不推荐使用;
v-if 和 JS中的 if 语句很相似;
- 双分支:
- 多分支:
v-if 和 v-else-if;
- 可以写多个
v-else-if,判断的条件不一样;
- 注意:
- 不管是 双分支 还是 多分支 ,使用的时候,标签与标签的关系 必须是 兄弟关系;
- 为什么在开发的时候不推荐使用?
- 在阅读代码的时候,如果看到
v-else-if 或 v-else,都必须先找到 v-if,才能明白后面的意思;
- 假如
v-if所在标签的代码很多,翻看的时候就是真的很难受哈;
- 所以大家还是尽量少用吧,是真的很烦;
2.5.3 示例展示
<template>
<div>
<p v-if="!token">你好,请登录!</p>
<p v-else>xxx,欢迎回来!</p>
<p v-if="score >= 90">A</p>
<p v-else-if="score >= 80">B</p>
<p v-else-if="score >= 70">C</p>
<p v-else-if="score >= 60">E</p>
<p v-else-if="score < 60">D</p>
</div>
</template>
<script>
export default {
data() {
return {
token: "token...",
score: "85",
};
},
};
</script>
2.6 v-for
- 这里只介绍基本语法,关于该指令的 更新监测 和
key 请看下一章节;
- 作用:
- 列表渲染;
- 循环渲染标签结构;
- 按照 数组 / 对象 / 数字 循环生成;
- 在开发中,对象 和 数字 很少使用到(基本遇不到);
2.6.1 ✅❗ 数组
2.6.2 对象
2.6.3 数字
2.6.4 注意事项
- 让谁循环生成,
v-for就写在谁身上;
in 俩测 必须要有 空格;
v-for 的变量名 只能用在 v-for 的范围内;
- 在写
v-for 的时候,需要添加 key 属性;
2.6.5 示例展示
<template>
<div>
<ul>
<li v-for="(item, index) in arr" :key="index">
{{ item }} --- {{ index }}
</li>
</ul>
<ul>
<li v-for="item in stuArr" :key="item">
{{ item.id }}-{{ item.name }}-{{ item.sex }}-{{ item.hobby }}
</li>
</ul>
<ul>
<li v-for="(value, key) in tObj" :key="value">{{ value }} - {{ key }}</li>
</ul>
<ul>
<li v-for="n in count" :key="n">
{{ n }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
arr: ["小明", "小欢欢", "大黄"],
stuArr: [
{
id: 1001,
name: "孙悟空",
sex: "男",
hobby: "吃桃子",
},
{
id: 1002,
name: "猪八戒",
sex: "男",
hobby: "背媳妇",
},
],
tObj: {
name: "小黑",
age: 18,
class: "1期",
},
count: 10,
};
},
};
</script>
三、更新监测和key的作用
3.1 更新监测
- 目标结构变化,触发
v-for的更新;
- 哪些操作会导致目标结构发生变化并使
v-for更新?
- 数组的变更方法(改变原始数组的方法):
push、unshift、pop、shift、splice、reverse;
- 数组非变更方法(不改变原始数组的方法):
- 注意:
- 数组非变更方法,返回一个新数组,并不会导致
v-for的更新;
- 解决办法:
- 更新某个值;
v-for更新时,会循环出新的虚拟DOM,和旧的虚拟DOM结构比较,尝试复用标签就地更新(diff算法);
- 示例展示:
<template>
<div>
<ul>
<li v-for="item in arr" :key="item">{{ item }}</li>
</ul>
<button @click="reverseFn">数组变更方法</button>
<button @click="changeFn">数组非变更方法</button>
<button @click="noChangeFn">改变某个值</button>
</div>
</template>
<script>
export default {
data() {
return {
arr: [1, 2, 3, 4, 5],
};
},
methods: {
reverseFn() {
this.arr.reverse();
},
changeFn() {
this.arr = this.arr.slice(0, 3);
},
noChangeFn() {
this.$set(this.arr, 0, 1000);
},
},
};
</script>
4.3 key的作用
四、动态class
- 使用
v-bind 给标签 动态设置 class 的值;
- 语法:
<标签 :class = "条件 ? '类名1' : '类名2'"></标签>
<标签 :class = { 类名: 表达式 }></标签>
<标签 :class = ["固定类名", 条件 ? '类名1' : '类名2', { 类名: 表达式 }]></标签>
- 示例展示:
<template>
<div>
<p class="xiHa" :class="isActive ? 'active' : ''">嘻哈少年1</p>
<p class="xiHa" :class="{ active: 'active' }">嘻哈少年2</p>
<p :class="['xiHa', flag1 ? 'color1' : '', { color2: flag2 }]">嘻哈少年3</p>
</div>
</template>
<script>
export default {
data() {
return {
isActive: true,
flag1: true,
flag2: true
};
},
};
</script>
<style>
.xiHa {
font-size: 30px;
}
.active {
color: #9e03d6;
font-size: 40px;
font-family: '隶书';
}
.color1 {
color: red;
}
.color2 {
font-size: 50px;
}
</style>
五、动态style
- 给 标签 动态设置 style 的值;
- 语法:
:style = "{ css属性名: 表达式 }"
- 示例展示:
<template>
<div>
<p :style="{ backgroundColor: '#e6004b' }">动态设置style</p>
<p :style="{ color: colorStr }">鸡你太美</p>
</div>
</template>
<script>
export default {
data() {
return {
colorStr: "green",
};
},
};
</script>
六、计算属性
6.1 基础
- 计算属性:
- 一个数据属性的值,依赖于另外的数据属性计算而来的结果
- 语法:
computed: {
计算属性名() {
return 值;
}
}
- 使用:
- 计算属性也是vue变量,使用的时候,直接当作vue数据属性,直接使用即可。
- 注意:
- 计算属性也是vue数据属性,所以不要和data里的变量重名;
- 计算属性 必须要有
return;
- 计算属性 声明 的时候是 方法,但是在 使用 的时候是 属性(有return);
- 当依赖发生变化的时候,计算属性会重新执行,返回新的结果
- 使用场景:
- 当一个变量的值,需要通过另外的变量计算而来就使用计算属性(单选和多选框);
- 示例展示:
<template>
<div>
<p>{{ add }}</p>
</div>
</template>
<script>
export default {
data() {
return {
a: 10,
b: 20,
};
},
computed: {
add() {
return this.a + this.b;
},
},
};
</script>
6.2 计算属性缓存特性
- 计算属性基于依赖的值进行缓存,依赖的变量不变,都直接从缓存中取结果。
- 计算属性的优势:
- 缓存特性;
- 计算属性对应的函数执行后,会把 return 的值缓存起来;
- 如果依赖项不发生变化,多次使用都是从缓存中取值;
- 依赖项的值发生变化,函数会 自动 重新执行,并把最新的结果再次缓存起来。
6.3 进阶 - 完整写法
- 计算属性 也是 vue数据属性,也可以使用
v-model 双向关联 表单数据 的 值;
- 写法的选择:
- 只是读取值:
- 写简易写法(函数形式,必须要有 return );
- 给计算属性赋值:
- 语法:
computed: {
计算属性名: {
set(val) {
},
get() {
return 值
}
}
}
- 注意:
- 给计算属性 赋值,触发
set 方法;
- 使用 计算属性的 值,触发
get 方法。
- 代码展示:
<template>
<div>
<p>
<span>用户名:</span>
<input type="text" v-model="full" name="" id="" />
</p>
</div>
</template>
<script>
export default {
computed: {
full: {
set(val) {
console.log(val);
},
get() {
return "张三";
},
},
},
};
</script>
- 单选、多选、反选 案例:
<template>
<div>
<span>全选:</span>
<input type="checkbox" v-model="isAll" />
<button @click="opposite">反选</button>
<ul>
<li v-for="(item, key) in arr" :key="key">
<input type="checkbox" v-model="item.c" />
<span>{{ item.name }}</span>
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
arr: [
{
name: "猪八戒",
c: false,
},
{
name: "孙悟空",
c: false,
},
{
name: "唐僧",
c: false,
},
{
name: "白龙马",
c: false,
},
],
};
},
methods: {
opposite() {
this.arr.forEach((item) => (item.c = !item.c));
},
},
computed: {
isAll: {
set(val) {
this.arr.forEach((item) => (item.c = val));
},
get() {
return this.arr.every((item) => item.c === true);
},
},
},
};
</script>
七、侦听器
7.1 侦听基本数据类型
- 作用:
- 侦听
data 或 computed 属性值的改变。
- 语法:
watch: {
被侦听的属性名(newVal, oldVal) {
}
}
- 示例展示:
<template>
<div>
<input v-model="keyWord" type="text" />
</div>
</template>
<script>
export default {
data() {
return {
keyWord: "",
};
},
watch: {
keyWord(newValue, oldValue) {
console.log(newValue, oldValue);
},
},
};
</script>
7.2 侦听引用数据类型
- 语法:
watch: {
data / computed里要侦听的属性名: {
deep: true,
immediate: true,
handler (newVal, oldVal) {
}
}
}
- 注意:
- 侦听引用数据类型,要加
deep: true 开启深度侦听;
- 属性名都是固定写法
- 新旧对象,原来的对象,三者指向同一地址。
- 示例展示:
<template>
<div>
<input v-model="uname" type="text" /> <br />
<input v-model="msg.age" type="text" />
</div>
</template>
<script>
export default {
data() {
return {
uname: "",
msg: {
age: 0,
},
};
},
watch: {
uname(newVal, oldVal) {
console.log(newVal, oldVal);
},
msg: {
deep: true,
handler(newVal, oldVal) {
console.log(newVal, oldVal);
console.log(newVal === oldVal);
console.log(this.msg === newVal);
},
},
},
};
</script>
八、事件处理
8.1 事件对象
- 语法:
- 方法没有传递实参:
- 事件处理函数不需要参数的时候;
- 声明方法的时候,直接通过形参直接接收,在方法中就可以直接使用;
- 方法有传递实参:
- 事件处理函数还需要其他的参数;
- 通过
$event 指代事件对象传给事件处理函数;

- Vue事件处理函数,如何拿到事件对象?
- 示例展示:
<template>
<div>
<a v-on:click="one" v-bind:href="url">{{ text }}</a>
<a @click="two(10, $event)" :href="url">{{ text }}</a>
</div>
</template>
<script>
export default {
data() {
return {
url: "http://www.baidu.com",
text: "阻止去百度",
};
},
methods: {
one(e) {
e.preventDefault();
},
two(num, e) {
e.preventDefault();
},
},
};
</script>
8.2 事件修饰符
- 语法:
@事件名.修饰符="方法名"
- 常用修饰符:
| 修饰符 | 功能 |
|---|
.stop | 阻止事件冒泡 |
.prevent | 阻止事件默认行为 |
.once | 程序运行期间,事件处理函数只执行一次(事件还能触发,事件处理函数只执行一次) |
.native | 监听原生事件(主要是和一些组件库一起使用) |
.self | 只当在 event.target 是当前元素自身时触发事件处理函数(即事件不是从内部触发的) |
| 更多修饰符 | 见Vue2官方文档 - 事件修饰符 |
- 注意:
- 多个修饰符可以一起使用;
.once修饰符还可以作用到组件的自定义事件上;
- 使用修饰符的时候,顺序很重要,相应的代码会以同样的顺序产生;
v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击;
- 示例展示:
<template>
<div>
<div @click="fatherFn" class="father">
<button @click.stop="oneFn">{{ textStop }}</button>
<br />
<a @click.prevent.stop="prevent" :href="url">{{ textPrevent }}</a>
<br />
<input @input.once.stop="input" @click.stop type="text" />
</div>
</div>
</template>
<script>
export default {
data() {
return {
textStop: ".stop - 阻止事件冒泡",
url: "http://www.bilibili.com",
textPrevent: ".prevent - 阻止事件默认行为",
textOnce: ".once - 程序运行期间,只触发一次事件处理函数",
i: 1,
};
},
methods: {
fatherFn(e) {
console.log(`我是${e.target.tagName}的父级`);
},
oneFn(e) {
console.log(`我点击了${e.target.tagName}`);
},
prevent() {
console.log("阻止了a链接的默认跳转");
},
input() {
console.log(this.i++);
},
},
};
</script>
8.3 键盘按键修饰符
- 语法:
@键盘事件.enter ➡ 监测回车按键
@键盘事件.esc ➡ 监测esc按键
- 更多按键修饰符
- 示例展示:
<template>
<div>
<input type="text" @keydown.enter="enterFn" @keydown.esc="escFn">
</div>
</template>
<script>
export default {
data() {
return {}
},
methods: {
enterFn() {
console.log('按下了回车键');
},
escFn() {
console.log('按下了取消键');
},
},
}
</script>
8.4 鼠标按键修饰符
| 修饰符 | 功能 |
|---|
.left | 按下鼠标左键 |
.middle | 按下鼠标滚轮键 |
.right | 按下鼠标右键 |
8.5 系统修饰符
请注意修饰键与常规按键不同,在和 keyup 事件一起用时,事件触发时修饰键必须处于按下状态。换句话说,只有在按住 ctrl 的情况下释放其它按键,才能触发 keyup.ctrl。而单单释放 ctrl 也不会触发事件。如果你想要这样的行为,请为 ctrl 换用 keyCode:keyup.17。
8.6 .exact修饰符