Vue 监听属性–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
// 方法一

new Vue({
el:"",
data:{},
watch:{
需要监听的变量或对象名:fuction(newVal,oldVal){
do something ...
}
}
})

// 方法二

new Vue({
el:"",
data:{},
watch:{
需要监听的变量或对象名:{
handler(newVal,oldVal){
do something ...
}
}
}
})

实例: 千米和米单位实时转换工具

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
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>千米和米单位的实时转换工具</title>
<script src="https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script>
</head>
<body>
<div id="app">
千米: <input type="text" v-model="kilometer">
米: <input type="text" v-model="meter">
<div>
<p>{{tipText}}</p>
</div>
</div>
<script>
new Vue({
el:"#app",
data:{
kilometer:0,
meter:0,
tipText:''
},
watch:{
// 写法一
kilometer:{
handler(newVal,oldVal){
this.meter = this.kilometer*1000;
this.tipText = "更改千米值 从"+oldVal.toString()+"到"+newVal.toString();
}},
// 写法二
meter:function (newVal,oldVal){
this.kilometer = this.meter/1000;
this.tipText = "更改千米值 从"+oldVal.toString()+"到"+newVal.toString();
}
}
})
</script>
</body>
</html>

监听对象中的某一项

监听对象中的某一项时,需要通过其所属的对象进行监听 写法为 “对象.属性名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
new Vue({
el:"#app",
data:{
test_object:{
child1:"",
child2:""
}
},
watch:{
test_object.child1:function(newVal, oldVal){
// do something
}
}
})

监听整个对象 deep 深度监听

vue无法监听多层级的对象, 除非将deep的值设置为 true 但需要注意的是监听整个对象的内存消耗将会非常大

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
new Vue({
el:"#app",
data:{
test_object:{
child1:"",
child2:""
}
},
watch:{
test_object:{
handler(newVal, oldVal){
// do something
},
deep:true, // 关键步骤,不然监听不到
}
}
})

immediate

immediate参数设置为true时,当页面加载完毕后就会调用一次监听函数

参考资料

CSDN-宠297 VUE中watch的详细使用教程

CSDN-白桃味稠鱼烧 Vue-watch-deep 深度监听