一: 原理分析
vue2是通过Object.defineProperty实现数据响应式,当我们修改已有的属性,访问或者修改的时候,能够触发setter与getter。但是当我们为obj添加新属性的时候,是无法触发事件属性的拦截的 原因是一开始原先的属性被设置成了响应式,但是后面新增的属性,是没有被设置的。
二:解决方案
vue是不允许在已经创建的实例上动态添加新的响应式属性的 解决方案:
- Vue.set()
- Object.assign()
- $forceUpdated()
$forceUpdate
迫使Vue
实例重新渲染。仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。
三:小结
- 如果为对象添加少量的新属性,可以直接采用Vue.set()
- 如果需要为新对象添加大量的新属性,则通过Object.assign()创建新对象
- 如果你需要进行强制刷新时,可采用$forceUpdate()
vue3是用过proxy实现数据响应式,直接动态添加新属性仍可以实现数据响应式。