Vue中:(数组篇)响应式问题?

328 阅读1分钟

前言

在Vue开发中,我们知道Vue的响应式原理是通过Object.defineProperty对数据进行劫持, 并结合发布订阅者模式实现。Vue 利用Object.defineProperty 创建一个 observe 来劫持监听所有的属性,把这些属性全部转为getter 和 setter。Vue 中每个组件实例都会对应一个 watcher 实例,它会在组件渲染的过程中把使用过的数据属性通过 getter 收集为依赖。之后当依赖项的 setter 触发时,会通知 watcher,从而使它关联的组件重新渲染。

b3a2d5b221cd48d57b7646fc5e0a7441.png

但是为什么有时候我们通过索引/下标修改数组里面的元素时候,不是响应式的呢?

根本原因是性能问题(尤雨溪:性能代价和获得的用户体验收益不成正比)*

性能问题.jpg

解决方法 (方法一:splice方法)

使用数组变更/变异 方法 splice。

方法一splice.jpg

解决方法 (方法二:this.$set 或 Vue.set)

使用数组变更/变异 方法 splice。

方法二$set.jpg

解决方法 (方法三:this.$forceUpdate() )

使用数组this.$forceUpdate() 强制更新方法。

方法三forceUpdate.jpg