1. 侦测数据的变化(数据劫持 / 数据代理)
– Vue2.0——Object.defineProperty()
- 无法检测到对象属性的添加或删除
- 无法监听数组的变化,需要进行数组方法的重写
– Vue3.0——Proxy
- 直接代理整个对象,不需要遍历对象的每个属性
- 支持代理数组的变化
2. 收集视图依赖了哪些数据(依赖收集)
- 在getter中收集依赖,在setter中触发依赖,
- 将观察者Watcher对象存放到当前闭包中的订阅者Dep的subs中。
3. 数据变化时,自动“通知”需要更新的视图部分,并进行更新(发布订阅模式)
当对象的值变化的时候,会触发对应的setter,setter通知之前依赖收集得到的Dep中的每一个watcher,告诉他们自己的值改变了,需要重新渲染视图,这时候Watcher就会开始调用update来更新视图。
在 Vue 中会把传入的 data 转换成 Observer 对象,Observer 接收的对象可能是数组,或纯对象。
- 纯对象情况
- 如果是纯对象, 则遍历这个对象,通过 Object.defineProperty 拦截对成员的遍历
- 并且为每一个成员创建一个 Dep, 每个成员在被读取的时候会收集当前的 watcher
- 【注释】watcher 分为三种
- render watcher, Dep 收集到这个 watcher 后,调用 notify 会更新当前组件
- computed watcher, vm 在