Computed–计算属性
- 被计算出来的就是计算属性
用户名重复展示
1 | // 用户名多处展示,使用computed计算属性 |
列表展示
1 | let id = 0 |
缓存
- 如果computed依赖的属性没有变化,就不会重新计算
- getter/setter 默认不会做缓存,Vue做了特殊处理
Watch监听器
- 当watch监听的数据发生变化时,执行一个函数
撤销操作
1 | new Vue({ |
使用watch模拟computed
1 | new Vue({ |
解决watch默认选项问题 immediate: true,第一次的值也要监听
1 | new Vue({ |
什么是数据变化
1 | new Vue({ |
- obj原本是 {a: ‘a’},后来变为 obj= {a: ‘a’}
- obj变了吗?变了,因为对象的地址变了;obj.a变了吗?没有
- 所以简单类型看值,复杂类型(对象)看地址
watch监听更深层的值 deep: true
- deep: true的意思是,watch监听时,是否往更深层去监听变化
- 数据变化时,我们一般只比较obj的地址,但在Vue可以做到不仅仅比较地址,还比较里面的数据变化
1
2
3
4
5
6
7
8
9
10
11watch: {
n(){
console.log('n 变了')
},
obj:{
handler() {
console.log('obj 变了')
},
deep: true // 深比较,虽然对象地址没变,但obj里属性的值发生变化,也算obj变了
}
}
watch的语法
- watch的几种写法
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// 写法1
watch: {
o1: ()=>{}, // 不要使用箭头函数,因为这里的this是全局对象
o2: function(value, oldValue){},
o3: (){},
o4: [f1,f2],
o5: 'methodName',
o6: {
handler: fn,
deep: true,
immediate: true,
'obj.a': function(){}
},
}
// 写法2
vm.$watch('n', function(){
console,log('n 变了')
}), {immediate: true}
// 写法3:放在钩子里
created(){
this.$watch('n', function(){
console.log('n 变了')
}, {immediate: true})
}
computed VS. watch
- computed 用来计算出一个值,这个值在调用时不需要加括号,可以当属性用;并且会根据依赖自动缓存,如果依赖不变,computed的值就不会重新计算
- watch 用来监听,若某个属性发生变化,就去执行一个函数。它有两个选项:immediate表示第一次渲染时,是否执行这个函数;deep表示监听一个对象时,是否要监听对象里面的变化