vue数组如何依赖跟踪?

260 阅读2分钟

前言

观前提醒:

  1. vue版本为2.6.12,现阶段的vue3的实现方式将有所不同。
  2. 阅读本文前,请了解vue中Array型数据的变化可观测即如何劫持Array型数据的修改,以及vue的依赖类(Dep类)是如何实现的。
  3. 此文非常概括性描述如何实现vue数组如何依赖跟踪,详细请阅读源码,或搜一搜李永宁
  4. 看我文字描述,不如直接在总结看图(个人意见)

Array不推荐使用Object.defineProperty方法,那怎么进行这个依赖的收集和通知呢?

Object.defineProperty对于Array来说,性能开销非常大。假如数组长度为100000,则有100000个setter和getter

依赖收集

其实Array型数据的依赖收集方式和Object数据的依赖收集方式相同,都是在getter中收集。

但不是Array型数据上触发,而是在上一层的Object中的getter触发 Arraygetter

哪里来的上一层?

我们在组件中是这么写这个data的

data(){
  return {
    arr:[1,2,3]
  }
}

我们写的所有数据,外面有一层对象数据包裹着。

依赖通知

相信你已经知道了,Array是如何实现变化可观测的,就是重写了push方法等。 那在重写的push方法中,进行这个依赖的通知,告诉页面,数据更新了,你该更新了。

那怎么去调用这个依赖的通知呢,其实在调用数据初始化(new Obeserver(data))的时候,为数组创建了一个__ob__ 属性,这个属性就是响应式对象(Observer),包含了依赖类(Dep()),只要能访问这个属性就能调用通知依赖的方法。

总结

不多bb直接上图

vue数组依赖.png