手写一个极简的MVVM
知识点:
- MVVM 是采用数据劫持(数据代理)配合发布订阅模式来实现的
- Vue 2 数据劫持利用的是 Object.defineProperty() ,Vue 3 改为 Proxy
- 编译模板用的是正则,提取各种指令,区分动态的数据和静态的数据,编译成虚拟DOM
- data中的数据只有一份,而模板中的DOM可以有很多处使用到某个数据,这里是一对多的关系,用到的是观察者模式
注:发布订阅模式 和 观察者模式 是一回事,data里的数据就是发布者,改变某个数据时要通知所有订阅者,而模板中使用了这个数据的元素(可以有多个)就全都是它的订阅者,或者说观察者,数据改变了它们就全都要更新。说发布订阅可能更好理解,而观察者模式可以这么理解: 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,目标对象进行广播通知。也就是说,被观察的目标对象就对应发布者,一个个观察者对象就对应一个个订阅者(可以用“围观者”记忆)。
在Vue里面,有Compile、Observer、Watcher、Dep、Updater 等等抽象出来的类。这里尽量简化,只手写最基本的Compile、Observer和Watcher(功能也不完整)。
Compile负责模板编译,把每个动态绑定了数据的DOM变成订阅者,并添加到所绑定的那个数据的Observer上,Observer相当于发布者,每个数据都对应一个Observer对象,每个Observer维护一个订阅者的数组,当观察到数据变化,就对数组里的所有订阅者进行notify。