Vue 不允许在已经创建的实例上动态添加新的根级响应式属性(root-level reactive property)。然而它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上
是否如上图demo代码示例那样,不能动态添加与a属性同级的新属性,只能将新属性添加到嵌套的对象a里?
PS:页面渲染结果为1 2
Vue 不允许在已经创建的实例上动态添加新的根级响应式属性(root-level reactive property)。然而它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上
是否如上图demo代码示例那样,不能动态添加与a属性同级的新属性,只能将新属性添加到嵌套的对象a里?
PS:页面渲染结果为1 2
6 回答3.1k 阅读✓ 已解决
6 回答2.5k 阅读
5 回答6.5k 阅读✓ 已解决
2 回答2k 阅读✓ 已解决
2 回答1.6k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
2 回答1.8k 阅读✓ 已解决
首先,楼主的结论是正确的,如果尝试在已经创建的实例上动态添加新的根级响应式属性的话,会报如下的错误:
那么,为什么不允许添加新的根级响应式属性?
简单地解读一下,比如我们有以下一个Vue实例,输出到控制台看看结构:
我们可以看到实例下也有a、b属性,而不只是在$data对象里面,为什么?
原因是Vue实例创建时会根据data中的属性进行一系列的初始化操作。举个例子,实例创建时,会在实例上注册对应的ProxyGetter和ProxySetter,在Vue的源码里可以找到这样一段代码:
这是个什么东西?字面意思,getter代理器和setter代理器呗。a、b属性明明在test.$data对象下,为什么我们能够访问,甚至修改它们?就是ProxyGetter和ProxySetter起的作用。
说到这里,你大概会想到,其实初始化Vue实例时不只做了这么点操作,还有很多很多,都是跟data有关的。那么,如果你添加的是根响应式属性,那么要做的工作几乎和重新初始化一个Vue实例差不多了。。。