我仔细阅读并重新阅读了Vue文档"Reactivity in Depth"以及vm.$set和Vue.set的API,但我仍然很难确定何时使用哪个。我能够区分这两者是很重要的,因为在我目前的Laravel项目中,我们动态地在对象上设置了很多属性。
文档中的区别似乎是在vm。$ set为"对于Vue实例"的语言之间。而Vue.set是"对于普通数据对象"并且Vue.set是全局的:
但是,有一些方法可以添加属性并使其具有反应性 已创建实例。
对于Vue实例,您可以使用$ set(path,value)实例方法:
vm.$set('b', 2)
// `vm.b` and `data.b` are now reactive
对于普通数据对象,您可以使用全局Vue.set(对象,键, 价值)方法:
Vue.set(data, 'c', 3)
// `vm.c` and `data.c` are now reactive
最后,我想知道第三个"选项"执行上述操作(用于一次添加多个属性)可以用作上述2个选项中的任何一个的等效替代(通过仅添加1个属性而不是多个)?
有时您可能希望将一些属性分配给 现有对象,例如使用Object.assign()或_.extend()。 但是,添加到对象的新属性不会触发更改。 在这种情况下,使用两者的属性创建一个新对象 原始对象和mixin对象:
// instead of `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })
答案 0 :(得分:21)
以下是随着Vue.set引入的发行说明:
Vue不再使用$ set和$ delete方法扩展Object.prototype。 这导致依赖于这些库的库出现问题 某些条件检查中的属性(例如Meteor中的minimongo)。 而不是对象。$ set(键,值)和对象。$ delete(键),使用 新的全局方法Vue.set(object,key,value)和Vue.delete(object, 键)。
因此,.$set
过去在所有对象上都可用 - 它现在仅在视图模型本身上可用。因此,Vue.set
用于这些情况,当您引用了一个被动对象但没有对它所属的视图模型的引用时。
答案 1 :(得分:2)
简而言之,两者都是相同的,$set
可以在像this.$set()
这样的组件(实例)中使用,其中Vue.set
是全局可用的静态方法。
this。$ set(someobject,'key','value')
Vue.set(someobject,'key','value')
答案 2 :(得分:0)
发现仅使用一次.$set()
向对象添加一个以上的属性就能很好地工作,也许Vue首先将这些添加的属性收集到一个序列中,然后将这些序列应用于getter和setter;例如
Vue.set(this.b,'first','first');
this.b.second = 'second';
this.b.third = 'third';
this.b.fourth = 'fourth';
'second','third','fourth'
的反应性也像'first'