在梳理具体的响应式之前,可以从官网上的这张图一窥整体逻辑:

从上图中,抛却 UI 部分,我们可以将响应式核心逻辑拆分为以下几个部分:
- 数据劫持
- 依赖收集
- 依赖触发
事实上,Vue 的核心代码就是围绕着这三部分展开的:
js
import { observe } from '../observer/index'
import Watcher from '../observer/watcher'
const data1 = {
msg: 'data1'
}
const data2 = {
msg: 'data2'
}
// 数据劫持
observe(data1)
observe(data2)
// 依赖收集、依赖触发
new Watcher(null, () => data1.msg + data2.msg, (value) => {
console.log('value', value)
})简单整理一下上述代码的逻辑:
- 数据劫持:
observe函数对数据进行劫持,为每个数据添加getter和setter。 - 依赖收集:
Watcher类在创建时,会调用get方法,在get方法中,会调用pushTarget将当前Watcher实例添加到Dep.target中,然后调用getter方法,在getter方法中,会调用Dep.depend方法,将当前Watcher实例添加到Dep的subs数组中。 - 依赖触发:当数据发生变化时,会调用
setter方法,在setter方法中,会调用Dep.notify方法,遍历Dep的subs数组,调用每个Watcher实例的update方法,最终调用run方法,执行回调函数。