【问题标题】:VueJS: Reactive array of objectsVueJS:反应式对象数组
【发布时间】:2020-05-17 22:46:05
【问题描述】:

这听起来可能微不足道,但事实并非如此。总结一下:

  1. 我们有一个对象数组(最初为空)存储在数据中。
  2. 创建组件时,我们通过自定义fabric方法将一些对象添加到数组中。
  3. Fabric 方法接受基础对象并使用一些额外的道具对其进行扩展。
  4. fabric方法添加的props之一是对数据的引用(this.foo)。

问题:生成的对象没有反应性,并且对this.foo 更改没有反应。

演示:https://codesandbox.io/s/vigilant-framework-47me6?fontsize=14&hidenavigation=1&theme=dark

到目前为止我所尝试的:

  1. 使用 hack 返回新的 Vue(...) 以使对象具有响应性 (https://github.com/vuejs/vue/issues/2660)。
  2. 使用$set 在fabric 方法中设置其他属性。

所以问题是:我们如何让对象反应?

附:我知道使用观察者/计算是选项,但在这种情况下不是。我希望对象具有反应性,而不是手动更新整个对象数组。

【问题讨论】:

  • 您可以尝试用具有所有必要道具的新对象替换数组中的对象。这样,对象就变成了反应对象。对象中的所有道具必须在此对象位于数据部分本身或数组中之前存在。或者你应该为你添加的所有新道具使用 $set。

标签: javascript vue.js vuejs2 reactive-programming vue-reactivity


【解决方案1】:

好吧,问题是当你这样做时

{ foo: this.foo }

您只是将存储在 this.foo 中的实际值传递给新对象的 foo 属性,它在实例化时为 0,这就是 javascript 处理原始值的方式。

如果您不想使用计算属性或观察者,您可以使用对象而不是原始值,原始值通过引用而不是值来分配。

所以你可以像这样在数据对象中定义你的 foo 属性:

foo: {val: 0}

像这样在 addedProps 中分配你的值

{foo: this.foo}

并像这样增加值

setInterval(() => this.foo.val++, 250);

这是您使用上述https://codesandbox.io/s/vue-reactive-object-ybji5修改的代码

谢谢,

【讨论】:

    猜你喜欢
    • 2019-11-09
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2020-11-12
    • 2018-11-06
    相关资源
    最近更新 更多