🌱 vue
双向数据绑定原理:监听器
、解析器
、观察者
。
MVVM双向数据绑定流程
html
1 | <div id="app"> |
初始化mvvm
1 | function MyVue(options) { |
实现监听器 Observe
Observer 遍历数据对象。
如果对某个数据赋值,会触发setter,就能监听数据变化
如果获取某个数据,会触发getter
1 | MyVue.prototype._observe = (data) => { |
实现解析器 Compile
compile方法主要做以下事情:
- 解析模板指令
- 将模板中的变量替换成数据
- 初始化渲染视图并且给每个指令对应的dom绑定update函数
- 数据变化,通知视图更新
1 | // root为根元素 |
实现观察者 Watcher
每次数据发生变化 都会触发Watcher去更新视图
1 | /** |
调用MyVue
1 | // 调用 MyVue |
最终效果
总结
- vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的。
- Vue2.x版本双向数据绑定的核心是Object.defineProperty方法,劫持对象的访问器,在属性值发生变化时我们可以获取变化,从而进行进一步操作。
- 通过监听器和解析器的协作,触发Watcher更新视图
在即将到来的Vue3.x中,将会使用ES6的Proxy代替Object.defineProperty,它可以直接劫持整个对象,并返回一个新对象,不管是操作便利程度还是底层功能上都远强于Object.defineProperty。