vm。$ set和Vue.set有什么区别?

时间:2016-04-16 23:46:34

标签: javascript laravel vue.js

我仔细阅读并重新阅读了Vue文档"Reactivity in Depth"以及vm.$setVue.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 })

3 个答案:

答案 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'