在梳理具体的响应式之前,可以从官网上的这张图一窥整体逻辑:
从上图中,抛却 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
方法,执行回调函数。