Skip to main content

Vue 中 watch 对象内属性的方法

vue 提供了 watch 方法,用于监听实例内 data 数据的变化。通常写法是:

new Vue({
data: {
count: 10
blog:{
title:'my-blog',
categories:[]
}
},
watch: {
count: function (newval, oldVal) {
console.log(`new: ${newVal}, old: ${oldVal}`);
}
}
})

上述情况里 data 中的 count 属性可以直接监听,但是如果需要监听的数据是对象内的某一属性值的变化,直接 watch 对象 blog 是检测不到变化的,这是因为 blog 这个对象的指向并没有发生改变。有几个解决方法

1.深度监测

new Vue({
data: {
count: 10
blog:{
title:'my-blog',
categories:[]
}
},
watch: {
blog:{
handler(newVal,oldVal){
console.log(`new: ${newVal}, old: ${oldVal}`);
},
deep:true
}
}
})

里面的 deep 设为了 true,这样的话,如果修改了这个 blog 中的任何一个属性,都会执行 handler 这个方法。不过这样会造成更多的性能开销,尤其是对象里面属性过多,结构嵌套过深的时候。

注意:watch 可以监听该数组的变化,不过输出的 newVal 和 oldVal 为同一个数据

之所以说 watch 监听到了值的变化,是因为有输出,有输出证明数据已经变化了,不会保留之前的副本

image.png

使用 computed 计算属性

new Vue({
data: {
count: 10
blog:{
title:'my-blog',
categories:[]
}
},
computed: {
categories() {
return this.blog.categories;
}
},
watch: {
categories(newVal, oldVal) {
console.log(`new:${newVal}, old:${oldVal}`);
},
},
})

参考文章:https://blog.csdn.net/weixin_43760969/article/details/108375814 > https://segmentfault.com/a/1190000018080301