起源:在 Vue 的数据绑定中会对一个对象属性的变化进行监听,并且通过依赖收集做出相应的视图更新等等。
问题:一个对象所有类型的属性变化都能被监听到吗?

之前用 Object.defineProperty通过对象的 getter/setter简单的实现了对象属性变化的监听,并且去通过依赖关系去做相应的依赖处理。
但是,这是存在问题的,尤其是当对象中某个属性的值是数组的时候。
正如 Vue 文档所说:

由于 JavaScript 的限制,Vue 无法检测到以下数组变动:

在这里插入图片描述

在这里插入图片描述

结论:

在将数组处理成响应式数据后,如果使用数组原始方法改变数组时,数组值会发生变化,但是并不会触发数组的setter来通知所有依赖该数组的地方进行更新,为此,vue通过重写数组的某些方法来监听数组变化,重写后的方法中会手动触发通知该数组的所有依赖进行更新。

Logo

前往低代码交流专区

更多推荐