前言
观前提醒:
- vue版本为2.6.12,现阶段的vue3的实现方式将有所不同。
- 阅读本文前,请了解vue中
Array
型数据的变化可观测即如何劫持Array
型数据的修改,以及vue的依赖类(Dep类)是如何实现的。 - 此文非常概括性描述如何实现vue数组如何依赖跟踪,详细请阅读源码,或搜一搜李永宁
- 看我文字描述,不如直接在总结看图(个人意见)
Array
不推荐使用Object.defineProperty
方法,那怎么进行这个依赖的收集和通知呢?
Object.defineProperty
对于Array
来说,性能开销非常大。假如数组长度为100000,则有100000个setter和getter
依赖收集
其实Array
型数据的依赖收集方式和Object
数据的依赖收集方式相同,都是在getter
中收集。
但不是Array
型数据上触发,而是在上一层的Object
中的getter
触发 Array
的 getter
。
哪里来的上一层?
我们在组件中是这么写这个data的
data(){
return {
arr:[1,2,3]
}
}
我们写的所有数据,外面有一层对象数据包裹着。
依赖通知
相信你已经知道了,Array是如何实现变化可观测的,就是重写了push方法等。 那在重写的push方法中,进行这个依赖的通知,告诉页面,数据更新了,你该更新了。
那怎么去调用这个依赖的通知呢,其实在调用数据初始化(new Obeserver(data))的时候,为数组创建了一个__ob__
属性,这个属性就是响应式对象(Observer),包含了依赖类(Dep()),只要能访问这个属性就能调用通知依赖的方法。
总结
不多bb直接上图