图片来自:https://ustbhuangyi.github.io/vue-analysis/reactive/summary.html

- 核心去观测数据的变化,当数据变化以后,能通知对应的观察者,来实行相关的逻辑
- Dep 的实现是最核心,实际上连接数据与对应观察者的桥梁
- Vue 初始化的时候,对不同指令对应的属性做处理,对于 data 和 props,会通过 observer 和 defineReactive 等一系列操作,把整个 data 和 props 定义的对象每一个属性变成响应式属性,同时内部设置一个 Dep 实例
- 当访问这些数据的时候,会触发 Dep.depend 来收集依赖,收集依赖是收集当前正在计算 watcher(dep.target)作为订阅者来订阅这些数据变化
- 当修改这些数据,会调用 dep.notify 来通知订阅者做 update 逻辑
- 对于 computed 这个属性,内部会创建 computed watcher,每一个 computed watcher 会持有 Dep 实例,访问 computed 属性,会调用 computed evaluate 一个计算方法, 这时候会触发内部持有 dep.depend 去收集依赖,也会收集正在计算的 watcher,把这些 watcher 作为订阅者收集起来,作用是当计算属性依赖值发生变化,触发 computed watcher 重新计算,当计算结果变了,调用 dep.notify,通知 computed 订阅者,触发他们更新
- 对于 watcher 来说,会创建一个 user watcher(用户自定义 watcher),会观察 data 和计算属性变化,会创建一个 watcher 去观察 data 和计算属性变化,如果发生变化,通知 Dep 去遍历所有的 user watcher,来触发 dep.update,然后判断新旧值发生变化,就调用 user watcher 的 run 方法,执行用户定义的回调函数
- 数据渲染过程与数据重新渲染是基于响应式系统,Vue 创建过程中会对每一个组件,会执行组件的 mount 方法,内部会创建唯一的 render watcher,在执行 render(去渲染成 vnode 过程中),会访问到 data 中定义的数据或者计算属性,render watcher 作为一个订阅者,订阅了数据与计算属性的变化,一旦发生变化,会触发 setter.notigy,computed watcher 中的 notify,然后触发 render watcher 的 update,然后执行 render watcher 的 run 方法,最终调用 updateComponent,这个方法会重新做一次渲染。
- 基于响应式原理,实现数据变化,刷新页面的效果
抽象分析 data/props 的响应式
- Vue 初始化会把 data 或者 props 中定义的属性变成响应式的,并创建一个 Dep 实例
- 当访问这些数据的时候,会触发 Dep.depend 来收集 正在计算的 watcher(dep.target) 作为订阅者
- 当修改数据的时候会调用 dep.notify 来通知订阅者
抽象分析 computed 的响应式
- 对于 computed 属性,内部有一个 computed watcher,
- 当访问 computed 属性的时候,会调用 dep.depend 来收集 computed watcher 作为订阅者
- 当计算属性发生变化的时候,当计算结果发生变化,会触发 dep.notify 来通知订阅者
抽象分析 user watch 的响应式
- 对于 watcher 来说,会创建一个 user watcher,
- 会观察 data 或者计算属性的变化,如果发生变化,会遍历所有的 user watcher 来触发 update
- 然后判断新旧值变化,如果确实变化了,执行 user watcher 的 run 方法,执行回调函数操作
抽象分析 组件的响应式
- 对于组件来说,每一个组件的初始化内部都有一个 render watcher,
- 在执行 render 过程中 会访问到 data 或者计算属性的值
- 如果发生变化,会触发 setter.notify 或者 computed 的 notify,然后触发 render watcher 的 update
- 执行 render watcher 的 run 方法,最终调用 updateComponent,来重新渲染
确认评论邮箱
邀请制评论