跳到主要内容

请解释 vm.$set(obj, key, val) ?

参考答案:

vm.$set(obj, key, val) 是 Vue.js 中的一个方法,用于向响应式对象中添加一个新的属性,并确保这个新属性同样是响应式的,即当它的值发生变化时,视图会自动更新。

在 Vue.js 中,当你创建一个对象并将其作为 Vue 实例的 data 属性时,Vue 会遍历这个对象的所有属性,并使用 Object.defineProperty 将它们转化为 getter 和 setter,使得当这些属性的值发生变化时,Vue 能够感知到并触发重新渲染。

但是,如果你后来向这个对象添加了一个新的属性,Vue 默认是不会感知到这个变化的,因为这个新属性并没有经过 Vue 的响应式处理。这时,你就可以使用 vm.$set 方法来手动添加这个新属性,并确保它是响应式的。

具体来说,vm.$set(obj, key, val) 的三个参数分别是:

  • obj:要添加新属性的对象。
  • key:要添加的新属性的键名。
  • val:要添加的新属性的值。

例如,假设你有一个 Vue 实例 vm,并且它有一个 data 属性 obj

new Vue({
  el: '#app',
  data: {
    obj: {
      a: 1,
      b: 2
    }
  }
})

如果你后来想要向 obj 添加一个新的属性 c,你可以这样做:

vm.$set(vm.obj, 'c', 3)

这样,obj 就变成了一个新的响应式对象,包含了 abc 三个属性。当 c 的值发生变化时,Vue 会自动感知到并触发重新渲染。

需要注意的是,vm.$set 只能用于向已经存在的对象添加新属性。如果你想要创建一个全新的响应式对象,你应该直接在 Vue 实例的 data 属性中定义它。