不同于angular的脏检测机制,vue通过对象劫持来实现数据双向绑定
实现思路
- 监听数据变化,通过Object.defineProperty API重写数据对象get、set存取器,数据变更时触发watcher中的队列回调
- 注册watcher,watcher对象连接数据和UI,数据变更触发watcher的update更新视图
- 编译模板,将dom和watcher绑定
上代码
dom结构
1 | <div id="app"> |
实现
1 | // watcher |
示例
1 | let data = { |
以上,一个简单的双向数据绑定就实现啦,我们不需要重复造轮子,但是要知道轮子背后的原理和思想,引申一下,对象劫持也可以使用ES6 Proxy实现,甚至更好,整个设计中基于发布/订阅的模式其实在很多场景下都能使用哦~
编译部分的实现有瑕疵,以后有时间再改