1、数据观测
1、初始化时获取data,判断data类型,可以是函数和对象,建议是函数
2、通过递归来深层次的观测
3、用object.defineProprietry的get和set方法来将数据变成可观测的,针对于与对象
4、重写数组方法,将其观测数组的变化,对数组的处理是有缺陷的,比如直接修改索引和通过索引修改数组长都是不会响应式
2、模板编译
1、模板转成ATS语法树
2、将ATS语法树生成成render函数
3、调用render函数生成虚拟dom,同时会获取数据
4、将虚拟don渲染成真实dom
3、依赖收集
Dep和Watcher关系:
多对多:
1、一个组件对应一个Watcher,一个属性对应一个Dep
2、一个视图可以有多个组件,一个属性可以在多个组件被使用,所以一个Dep对应了多个Watcher
3、一个组件可以使用多个不同的属性,所以一个Watcher包含了多个Dep
观察者模式
1、Watcher属于观察者、属性的Dep是被观察者
2、属性变化,会通知观察者来更新视图
Dep依赖收集Watcher
1、唯一id、subs数组收集Watcher
2、调用depend,记录当前的Watcher里面Dep的集合
3、Watcher去重相同的Dep
4、Dep收集上这个Watcher
Watcher记录Dep
1、唯一id、deps记录添加的Dep
2、addDep记录依赖,会去重,相同属性的Dep只会添加一个
3、update通知视图更新
// 数据观测的get、set方法
get() {
dep.depend() // 收集依赖 模板解析时会访问绑定的变量触发get添加依赖
}
set() {
dep.notify() // 数据变化通知更新
}
// Dep类
notify() {
this.subs.forEach(watcher => watcher.update()) // subs收集的依赖通知Watcher去更新视图
}
......还在完善,未完待续