问题:
父组件给子组件传递的props里面有一个值是一个对象,在子组件中通过watch监听该对象的变化,已经加上了deep: true
的相关配置,但是还是无法监听到该值的改变。
props: {
filter: {
type: Object,
default: () => {
return {}
}
}
},
//子组件通过监听watch监听filter的改变无效
watch: {
filter: {
handler(nv, ov) {
// 特别注意,不能用箭头函数,箭头函数,this指向全局
console.log('filter changed', nv)
},
deep: true // 可以深度检测到 obj 对象的属性值的变化
}
},
通过阅读官方文档相关深入响应式原理(https://cn.vuejs.org/v2/guide...)中得知:受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。
解决方案3种:
在父亲组件修改子组件的props值得时候,使用以下3种方式进行转化赋值
- 方案一:
Vue.set(object,key,value)
Vue.set(vm.obj,"status","succes")
- 方案二:
this.$set(this.object,key,value)
this.$set(this.obj,"status","success")
- 方案三:
Object.assign({},this.obj)
this.obj.status= "success";
this.obj = Object.assign({},this.obj)
// 或者
this.obj = Object.assign({ },this.obj,{"status","success"})