Vue.set
是 Vue.js 提供的一个方法,用于向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,即当它的值发生变化时,视图也会相应地更新。
原理上,Vue.js 使用了一个叫做 Object.defineProperty 的 JavaScript 方法来劫持对象属性的 getter 和 setter。这允许 Vue 在属性被读取或修改时执行一些自定义的逻辑,如触发视图更新。但是,由于 JavaScript 的限制,Vue 无法检测到以下变动:
- 当你利用索引直接设置一个项时,例如:
vm.items[indexOfItem] = newValue
- 当你修改数组的长度时,例如:
vm.items.length = newLength
对于对象属性的添加,Vue.js 在初始化实例时会对对象属性进行遍历,并使用 Object.defineProperty 将它们转化为 getter/setter,以便能够追踪变化。但是,对于对象在初始化之后添加的属性,Vue 无法自动追踪它们的变化,因为 Object.defineProperty 不能用于添加新的属性描述符。
这就是 Vue.set
方法的用武之地。Vue.set
的工作原理大致如下: