watch
侦听器字段定义仅包含点运算符和标识符,例如监听数组的第一个元素arr[0]
,正确的格式为"arr.0"
,注意不要和小程序observers
混淆。
🔴 深度监听(deep = true
)适用于引用类型(Object
,Array
)。引用类型非深度监听情况下,只有引用变化才会触发回调,就是需要整个对象替换掉,而深度监听则需要进行深度比对,计算量会比较大。
监听引用类型,可以无脑加上deep = true
,监听基本类型可以也加上deep = true
,只是会增加无意义的计算量。
PageEx({
data: {
arr: [{ num: 114 }],
arr2: [{ num: 1919 }]
},
watch: {
'arr.0': function (newVal, oldVal) {
console.log(`arr ${JSON.stringify(oldVal)} => ${JSON.stringify(newVal)}`);
},
'arr.0.num': function (newVal, oldVal) {
console.log(`arr[0].num ${JSON.stringify(oldVal)} => ${JSON.stringify(newVal)}`);
},
'arr2': {
handler: function (newVal, oldVal) {
console.log(`arr2 ${JSON.stringify(oldVal)} => ${JSON.stringify(newVal)}`);
},
deep: true
}
},
mounted() {
this.arr[0].num = 514;
this.arr2[0].num = 810;
}
});
输出:
arr[0].num 114 => 514
arr2 [{"num":1919}] => [{"num":810}]
🔴 指定immediate = true
,侦听器初始化时会触发一次回调,但此时组件还没有触发mounted
生命周期回调,所以还不能修改状态。
PageEx({
props: {
num: {
type: Number,
value: 114
}
},
watch: {
num: {
handler: 'numHandler',
immediate: true
}
},
methods: {
numHandler(newVal) {
console.log(`num = ${JSON.stringify(newVal)}`);
}
},
created() {
console.log('created');
},
mounted() {
console.log('mounted');
},
onLoad() {
console.log('onLoad');
}
});
输出:
num = 114
created
mounted
onLoad