Javascript 如何声明嵌套的被动组件?

Javascript 如何声明嵌套的被动组件?,javascript,vue.js,reactive-programming,Javascript,Vue.js,Reactive Programming,在阅读文档时,我看到了两个我不确定如何解释的要点: 将普通JavaScript对象作为其数据传递给Vue实例时 选项,Vue将遍历其所有属性并转换它们 使用Object.defineProperty获取/设置程序 由于现代JavaScript的局限性和 Object.observe,Vue无法检测属性添加或 删除。因为Vue执行getter/setter转换过程 在实例初始化期间,数据中必须存在属性 对象,以便Vue将其转换并使其处于反应状态 这与嵌套对象(例如 [ { "a":

在阅读文档时,我看到了两个我不确定如何解释的要点:

将普通JavaScript对象作为其数据传递给Vue实例时 选项,Vue将遍历其所有属性并转换它们 使用Object.defineProperty获取/设置程序

由于现代JavaScript的局限性和 Object.observe,Vue无法检测属性添加或 删除。因为Vue执行getter/setter转换过程 在实例初始化期间,数据中必须存在属性 对象,以便Vue将其转换并使其处于反应状态

这与嵌套对象(例如

[
  {
    "a": 1,
    "b": [
      {
        "c": 1
      },
      ...
    ]
  },
  {
    "a": 10,
    "b": [
      {
        "c": 10
      },
      ...
    ]
  },
  ...
]
具体来说,应该如何将此类对象呈现给数据,使其具有反应性


我想你是误解了。文档第一部分中引用的语句对示例对象适用。如果将该对象设置为data方法返回的对象的属性,则该对象中的所有内容都将是被动的

下面是一个简单的示例,我在data方法中将您的对象设置为myNestedData。我已经通过v-model将myNestedData[0].b[0].c绑定到输入元素,您可以看到对该值的更改反映在myNestedData对象本身中

Vue.config.productionTip=false; Vue.config.devtools=false; 新Vue{ el:“应用程序”, 资料{ 返回{ myNestedData:[{ 答:1,, b:[{ c:1 }] }, { a:10, b:[{ c:10 }] }] }; } }; {{myNestedData}}
谢谢你的详细回答。还有一点尚不清楚,那就是什么是可以补充的,什么是不能补充的。在您的示例中,您在this.foo[0].b中添加了一个非反应式。但如果foo被初始化为[],那么这样的添加是否可能?因为添加到列表中的任何内容显然都是“插入”,而不知道正在插入的内容,所以可以添加任何内容,但向已声明的对象添加属性不会是被动的。在我的示例中,如果foo被初始化为[],我可以将对象{b:'banana'}推送到数组中,然后这个.foo[0].b将是被动的,因为我没有向该过程中的任何现有对象添加新属性。啊,好的,我得到了它。这是一个添加到对象的特性,它不会是反应性的。非常感谢你澄清这一点。
data() {
    return {
        likeThis: [],
        orLikeThat: [{}],
        orMoreDetailed: [{a: null, b:[]}],
        orTheFullStucture: [{a: null, b:[{c: null}]}]
    }
}