Javascript 为什么监视的对象在vue中不更新
我知道有很多像这样的问题,但这一个有点不同。我看了一眼,认为我对这个问题有一个公平的理解,但有一件事我不能理解,那就是: tl;dr 为什么在使用Javascript 为什么监视的对象在vue中不更新,javascript,vue.js,Javascript,Vue.js,我知道有很多像这样的问题,但这一个有点不同。我看了一眼,认为我对这个问题有一个公平的理解,但有一件事我不能理解,那就是: tl;dr 为什么在使用currentValue=Object.assign=({},currentValue,initValue)初始化监视的属性寄存器时会发生更改,而不是使用直接赋值currentValue=initValue 我在vue组件的模型上有一个注册对象,scoreRules 在安装的挂钩中 我使用重新初始化模型的scoreRules this.$data.sc
currentValue=Object.assign=({},currentValue,initValue)
初始化监视的属性寄存器时会发生更改,而不是使用直接赋值currentValue=initValue代码>
我在vue组件的模型上有一个注册对象,scoreRules
在安装的挂钩中
我使用重新初始化模型的scoreRules
this.$data.scoreRules=initScoreRules代码>
(initScoreRules
作为道具传入,但我将其声明为本地
以下变量用于本问题)
查看scoreRules
以了解更改,并在对象更改时记录“分数已更改”
这段代码显示了这个场景
newvue({
el:“#应用程序”,
数据(){
返回{
计分规则:{
键入:“数字”,
最小值:null,
最大值:空
}
}
},
安装的(){
让initScoreRules={type:“number”};
此.$data.scoreRules=initScoreRules;
这个.$watch('scoreRules',()=>{console.log(“score已更改”)},{deep:true});
}
});代码>
最低分数
初始对象包含属性最小值
和最大值
。然后,在安装的中执行以下操作:
let initScoreRules = {type: "number"};
this.$data.scoreRules = initScoreRules;
这意味着现在,scoreRules
对象没有这些属性
Vue只能观察以下属性的更改:
- 在
data()
中预定义(您在mounted
中执行了此操作,但随后取消了此操作)
- 使用
Vue.set()
/此设置。$set()
- 存在于指定给被动特性的对象上
最后一点也是对第二个示例工作原理的解释:在这里,基本上是这样做的(去掉Object.assign verbosity,因为它会分散注意力):
此属性将是反应性的
请在此处阅读更多信息:
对象是引用类型。这就是为什么需要使用对象克隆对象。指定,而不是仅使用=
指向现有对象。创建新对象时,Vue有机会为对象及其属性设置其反应式环境。我明白了。使用=
执行直接赋值将指向一个非反应对象,因此对该对象的更改未注册。现在看来很明显。谢谢,谢谢@Linus。总结得很好。
this.$data.scoreRules = { minimum: null };