watch监听
# watch监听
虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。Vue通过watch选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的,在实际开发中可以解决自定义封装组件或是插件,异步初始化数据获取不到的问题。
看一样看watch基本用法,代码如下:
<input type="text" :value="name"/><button type="button" @click="name='李四'">改名</button>
<script>
new Vue({
el:"#app",
data(){
return {
name:"张三"
}
},
watch:{
name(newVal,oldVal){
console.log("更新后:"+newVal,"更新前:"+oldVal);
}
}
})
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
watch监听还可以监听计算属性,代码如下:
<input type="text" :value="name"/><button type="button" @click="name='李四'">改名</button>
<script>
new Vue({
el:"#app",
data(){
return {
name:"张三"
}
},
computed:{
getName(){
return this.name;
}
},
watch:{
getName(newVal,oldVal){
console.log("更新后:"+newVal,"更新前:"+oldVal);
}
}
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
如果出现对象嵌套,想改变对象里面的某一属性值时,可以这样写,代码如下:
<input type="text" :value="classify.children.title"/><button type="button" @click="classify.children.title='猪肉串'">更新</button>
new Vue({
el:"#app",
data(){
return {
classify:{
title:"肉类",
children:{
title:"羊肉串"
}
}
}
},
watch:{
"classify.children.title"(newVal,oldVal){
console.log("更新后:"+newVal,"更新前:"+oldVal);
}
}
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
在实际开发中还会遇到数组多层嵌套,这时要用watch的深度监听功能,来监听数组的变化,代码如下:
watch:{
classifys:{
handler(val){
console.log(JSON.stringify(val));
},
deep:true//深度监听
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 计算属性 vs 方法 vs 侦听属性
如果一个功能同时可以使用计算属性(computed)、方法(methods)、侦听属性(watch)来实现的时候推荐使用计算属性。
计算属性 | 方法 | 侦听属性 |
---|---|---|
计算属性是基于它们的响应式依赖进行缓存的 | 每当触发重新渲染时,调用方法将总会再次执行函数 | 有缓存,但相比计算属性,实现起来要复杂很多。 |
上次更新: 2022/05/30 12:17:36