Javascript 为什么监视的对象在vue中不更新

Javascript 为什么监视的对象在vue中不更新,javascript,vue.js,Javascript,Vue.js,我知道有很多像这样的问题,但这一个有点不同。我看了一眼,认为我对这个问题有一个公平的理解,但有一件事我不能理解,那就是: tl;dr 为什么在使用currentValue=Object.assign=({},currentValue,initValue)初始化监视的属性寄存器时会发生更改,而不是使用直接赋值currentValue=initValue 我在vue组件的模型上有一个注册对象,scoreRules 在安装的挂钩中 我使用重新初始化模型的scoreRules this.$data.sc

我知道有很多像这样的问题,但这一个有点不同。我看了一眼,认为我对这个问题有一个公平的理解,但有一件事我不能理解,那就是:

tl;dr

为什么在使用
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 };