1. 数据初始化流程
function initData(vm) {
var data = vm.$options.data;
data = typeof data === 'function' ?
data.call(vm, vm) : data || {};
new Observer(data);
}
function Observer(data) {
var keys = Object.keys(value);
for (let i = 0; i < keys.length; i++) {
// 设置成响应式
defineReactive(obj, keys[i]);
}
}
// 设置数据响应式的核心原理
function defineReactive(obj, key) {
var dep = new Dep();
var value = obj[key];
Object.defineProperty(obj, key, {
get() {
// 依赖收集
},
set() {
// 依赖更新
}
})
}
2. 依赖收集的流程
- 页面渲染函数
with(this) {
return _c('div', {}, [name])
}
-
读取name
渲染函数执行,此时的name就是当前组件实例上的name -
保存watcher
// 设置数据响应式的核心原理
function defineReactive(obj, key) {
var dep = new Dep();
var value = obj[key];
Object.defineProperty(obj, key, {
get() {
// 依赖收集
// 此时的Dep.target上面就是存储了watcher
// 哪里读取了这个obj[key], Dep.target上就是存储的那个watcher
if (Dep.target) {
// 添加进当前obj[key]的依赖数组中
dep.addSub(Dep.target);
}
},
set() {
// 依赖更新
}
})
}