vue.js 源码解读
双向绑定之 Object
完整代码 (https://github.com/mfaying/simple-vue/tree/master/src/01)
双向绑定对于 vue.js 来说非常重要,也是该框架的特色之一。那么该如何实现数据的双向绑定呢?本文将基于 vue.js 2.x 版本讲解双向绑定的原理。Object 和 Array 的实现原理有所不同,本文讲解 Object 双向绑定的原理。
要实现双向绑定,必须能监听到数据的取值和赋值,幸运的是 javascript 原生提供了 Object.defineProperty 可以实现监听。
1 | Object.defineProperty(data, key, { |
我们在 get 中收集依赖,在 set 中触发依赖。依赖收集在 dep 中,它的定义如下:
1 | export default class Dep { |
Dep 将依赖管理的逻辑解耦出来了。它的原理也很简单,基于数组来管理依赖。
那么依赖被通知了,它会执行什么呢?答案是 watcher。watcher 可以理解为任意数据改变需要触发操作的东西,如视图更新。
1 | import { parsePath } from "./util"; |
Watcher 和 Dep 通过一个共同变量 window.target,可以实现依赖的自动收集。
最后,我们需要一个 Observer 类,它可以将一个普通对象完全转换为响应式数据。无论 key 在对象的什么位置,因为它在实现上使用了递归。
1 | class Observer { |
最后让我们来验证一下
1 | import Observer from "./Observer"; |
参考
《深入浅出 Vue.js》
完整代码 (https://github.com/mfaying/simple-vue/tree/master/src/01)