双向数据绑定响应流程:
data中数据都被observe对象设置了新的set,get方法(相当于劫持数据的获取和更新),一旦数据变化,触发observe类里面的Object.defineProperty对象中的set方法,set方法中判断数据是新数据(newVal)还是旧数据(oldVal),如果是旧数据,直接return,如果是新数据,触发dep.notify方法去遍历存在dep对象中的各个watcher,并且通知wtacher,watcher执行update操作通过render函数编译成虚拟dom,(此前complie去解析旧模板,把ast抽象语法树通过render函数编译成虚拟dom),此时存了两份虚拟dom的数据,在patch阶段通过diff算法比对,逐层比较,最后调用vm._update把虚拟dom更新为真实dom。
Observer:
观察者类,把data中数据转化为响应式数据(使用核心方法Object.defineProperty来把传入的data中的数据进行数据劫持,配置对应的setter和getter,成为响应式数据)
dep:
发布者,用来存放watcher,属于一对多关系,一个dep中可以放多个订阅者,dep.notify()方法就是用来通知watcher的
watcher:
订阅者,存于dep对象中,每个data数据都会使用一次或多次,使用几次,dep中就存在几个watcher订阅者,方便数据更新时,及时通知各个使用该数据的节点,通知成功后,执行update方法,调用render函数
complier:
编译阶段,用来解析模板,把事先存好的AST语法的抽象树编译成render函数认识的语法进行渲染,方便后面进行虚拟dom的比对
render:
将complier和watcher的数据进行渲染成虚拟dom,两份数据准备好,准备在patch阶段进行比对
patch:
补丁,这个阶段进行两份虚拟dom的比对,比对算法采用diff算法,不再进行dom遍历,只是比较两份数据中同层级的变化,无变化,不动,有变化,就替换掉