Javascript 使用deep监视Vue中的嵌套对象

Javascript 使用deep监视Vue中的嵌套对象,javascript,vue.js,Javascript,Vue.js,我试图使用深度调用来监视具有多个属性的数据对象,我需要知道在监视调用中,对象中的哪个属性更改被触发。是否有任何方法可以知道处理程序中的属性 data(){ return { user:{ first_name:'', last_name:'', } } }, watch:{ user:{ deep:true, handler(value){ //He

我试图使用深度调用来监视具有多个属性的数据对象,我需要知道在监视调用中,对象中的哪个属性更改被触发。是否有任何方法可以知道处理程序中的属性

data(){
   return {
        user:{
           first_name:'',
           last_name:'',
            }
    }
},
watch:{
    user:{
       deep:true,
       handler(value){
       //Here I want to know which property(first_name/last_name) change of the user object has triggered this.
        }
    }
}

vue似乎无法确定更改了哪些属性

使用您的示例,当任何属性发生更改时,都会触发watch回调

但vue还有一个选择:

//密钥路径
vm.$watch('a.b.c',函数(newVal,oldVal){
//做点什么

})
您可以执行以下操作:


导出默认值{
名称:“应用程序”,
数据:()=>({
obj:{
建议1:“,
第2条:“,
第三项建议:,
},
}),
安装的(){
for(此.obj中的常量键){
这是一块50美元的手表(
()=>this.obj[key],
(新值、旧值)=>{
console.log(key、oldValue、newValue);
}
);
}
},
};
通过
此.watch
方法,您可以创建动态观察程序


有关更多详细信息,请参阅文档:

可能需要迭代对象并比较前后的值。@ChrisLi如果数据对象很大,那会很麻烦,我想知道Vue js是否有办法提供该属性。您还可以通过编程方式为每个键设置监视程序,我不知道vue是否为此提供了一种方法。@ChrisLi当我试图在深度观察中比较新旧值时,我发现这两个对象属性都用最新的值更新了,对此你有什么想法吗?可能是因为它们引用了同一个对象,我找到了一个解决方法@Gurmaks谢谢你的回答,我想在单个处理程序中处理整个对象更改,尽管我尝试比较对象,但Vue似乎正在将旧对象和新对象与最新值一起传递,因此无法进行比较,这是Vue中的错误还是我做错了。对不起,我忘记了。vue文档中的“注意:在变异(而不是替换)对象或数组时,旧值将与新值相同,因为它们引用相同的对象/数组。vue不保留预变异值的副本。”。这意味着在这种情况下,手动比较是无用的,因为newVal=oldVal。这是一个物体。我会更新我的答案,或者你可以重新创建对象,而不是变种。这个答案能解决你的问题吗?请接受这个答案,这将帮助其他人。