笔记内容来自于 b 站教学视频 尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通 张天禹老师
$event
$event可以用来在传参中占位
$event的位置是很灵活的,只要在 template 的方法传参中,传入了$event,那么在 methods 中就能在对应位置取到MouseEvent事件
事件修饰符
- Vue 中的事件修饰符
prevent:阻止默认事件(常用)【e.preventDefault】stop:阻止事件冒泡(常用)【e.stopPropagation】once:事件只触发一次(常用)capture:使用事件的捕获模式self:只有 event.target 是当前操作的元素时才触发事件passive:事件的默认行为立即执行,无需等待事件回调执行完毕
键盘事件
- Vue 中常用的按键别名
- 回车 => enter
- 删除 => delete(捕获“删除”和“退格”键)
- 退出 => esc
- 空格 => space
- 换行 => tab(结合 keydown 使用)
- 上 => up
- 下 => down
- 左 => left
- 右 => right
- Vue 未提供别名的按键,可以使用按键原始的 key 值去绑定,但注意要转为 kebab-case(短横线命名),
@keyup.caps-lock="showInfo" - 系统修饰键(用法特殊):
ctrl、alt、shift、meta(win键)- 配合 keyup 使用:按下修饰键的同时,再按下其他键,随后释放其它键,事件才被触发
- 配合 keydown 使用:正常触发事件
- 也可以使用 keyCode 去指定具体的按键(不推荐,因为不同键盘的按键略有不同,而且 keyCode 后续浏览器不再支持)
- Vue.config.keyCodes.自定义键名 = 键码,可以定制按键别名(不推荐)
计算属性
- 定义:要用的属性不存在,要通过已有属性计算得来
- 原理:底层借助了
Object.defineProperty方法提供的getter和setter - get 函数什么时候执行?
(1) 初次读取时会执行一次
(2) 当依赖的数据发生改变时会被再次调用 - 优势:与 methods 实现相比,内部有
缓存机制(复用),效率更高,调试方便 - 备注:
(1) 计算属性最终会出现在 vm 上,直接读取使用即可
(2) 如果计算属性要被修改,那必须写 set 函数去响应修改,且 set 中药引起计算时依赖的数据发生改变
计算属性内部有
缓存机制,提高效率,避免反复计算
计算属性简写形式
模板中点击事件 alert
- 模板中出现了
alert(1)方法调用,浏览器会先去 vm 身上找 alert 方法,发现没有,会向 vm 的原型对象上寻找,即 Vue 对象,发现还是没有,就会报错。
监视属性 watch
监视的两种写法
new Vue时传入watch配置- 通过
vm.$watch监视
监视多级结构中某个属性的变化
- 直接监视 number,里面的 a 或者 b 发生变化,并不会触发 watch 中 number 的 handler 方法,这是因为,number 中存的其实是
{a:1,b:1}的地址,改变 a 或者 b 的值,并没有改变这个对象的地址,所以监视不会触发
深度监视
- Vue 中的 watch 默认不监测对象内部值的改变(一层)
- 配置
deep:true可以检测对象内部值改变(多层)
备注:
- Vue 自身可以监测对象内部值的改变,但 Vue 提供的 watch 默认不可以
- 使用 watch 时根据数据的具体结构,决定是否采用深度监视
监视的简便写法
watch简便写法
vm.$watch简便写法
computed 和 watch 之间的区别
- 区别
- computed 能完成的功能,watch 都可以完成
- watch 能完成的功能,computed 不一定能完成,例如:watch 可以进行异步操作
- 两个重要的小原则
- 所被 Vue 管理的函数,最好写成普通函数,这样 this 的指向才是
vm或组件实例对象 - 所有不被 Vue 所管理的函数(定时器的回调函数、ajax 的回调函数、Promise 的回调函数等),最好写成箭头函数,这样 this 的指向才是
vm或组件实例对象
- 所被 Vue 管理的函数,最好写成普通函数,这样 this 的指向才是
绑定 class 样式
- 字符串写法,适用于:样式的类名不确定,需要动态指定
<div class="basic" :class="mood" @click="changMood">{{name}}</div>
data: {
mode: 'normal'
}
- 数组写法,适用于:要绑定的样式个数不确定、名字也不确定
<div class="basic" :class="classArr" @click="changMood">{{name}}</div>
data: {
classArr: ['a','b','c']
}
- 对象写法,适用于:要绑定的样式个数确定、名字也确定,但要动态决定用不用
<div class="basic" :class="classObj" @click="changMood">{{name}}</div>
data: {
classObj: {
a: false,
b: false
}
}
列表渲染
-
可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)
-
遍历数组
-
遍历对象
-
遍历字符串
-
遍历指定次数
key 作用与原理
vue 中的 key 有什么作用?
- 虚拟 DOM 中 key 的作用:
key 是虚拟 DOM 对象的标识,当数据发生变化时,Vue 会根据【新数据】生成【新的虚拟 DOM】,随后 Vue 进行【新虚拟 DOM】与【旧虚拟DOM】的差异比较,比较规则如下: - 对比规则:
- 旧虚拟 DOM 中找到了与新虚拟 DOM 相同的 key:
a. 若虚拟 DOM 中内容没变,直接使用之前的真实 DOM;
b. 若虚拟 DOM 中内容变了,则生成新的真实 DOM,随后替换掉页面中之前的真实 DOM。 - 旧虚拟 DOM 中未找到与新虚拟 DOM 相同的 key:
创建新的真实 DOM,随后渲染到页面
- 旧虚拟 DOM 中找到了与新虚拟 DOM 相同的 key:
- 用 index 作为 key 可能会引发的问题:
- 若对数据进行:逆序添加、逆序删除等破坏顺序操作:
会产生没有必要的真实 DOM 更新 ==> 界面效果没问题,但效率低 - 如果结构中还包含输入类 DOM:
会产生错误 DOM 更新 ==> 界面有问题
- 若对数据进行:逆序添加、逆序删除等破坏顺序操作:
- 开发中如何选择 key?
- 最好使用每条数据的唯一标识作为 key,比如 id、手机号、身份证号、学号等卫衣值;
- 如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,使用 index 作为 key 是没有问题的。
sort
- 前 - 后 = 升序
- 后 - 前 = 降序
let arr = [1, 3, 2, 6, 4, 5]
arr.sort((a,b)=>{
return a-b // 前 - 后 = 升序
})
// arr: [1,2,3,4,5,6]
let arr = [1, 3, 2, 6, 4, 5]
arr.sort((a,b)=>{
return b-a // 后 - 前 = 降序
})
// arr: [6,5,4,3,2,1]