谈谈vue双向绑定的原理

421 阅读2分钟

谈谈vue原理

所谓双向数据绑定, 无非就是数据层和视图层中的数据同步, 在写入数据时视图层实时的跟着更新, 实现mvvm的双向绑定,是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。就必须要实现以下几点:

  • 工具Dep类 订阅管理器。

在观察者模式中,Dep对象拥有添加、删除和通知一系列 Watcher订阅者 的方法等等,而 Watcher订阅者 对象拥有更新方法(update)等等。

  • compile-指令解析器Compile。

作用: 对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数。

实现方法: 首先每一个模板都是一颗树tree,使用递归去遍历这颗树,如果遍历过程中,发现当前遍历的节点是文本节点(这里以解析大括号为例子)即nodeType为3的,如果是则取出大括号内的变量,然后给这个变量添加一个Watcher订阅者。传给Watcher解析的变量和变量变化后需要调用的更新这个大括号对应文本节点文本内容的回调函数,这样当这个变量值被修改后,可以执行这个回调函数以实现视图更新。

  • Observer-数据监听器。

作用: 能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者。

实现方法:其实现核心方法就是前文所说的Object.defineProperty( )。如果要对所有属性都进行监听的话,那么可以通过递归方法遍历所有属性值,并对其进行Object.defineProperty( )处理, 我们在get函数中将Watcher订阅者添加到订阅管理器(Dep)的订阅池(subs)中,在set函数中调用Dep的通知方法,并遍历订阅池调用所有Watcher订阅者的更新视图函数(update)。

  • Watcher订阅者。

作用: 作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,属性变动触发后执行Watcher绑定的相应回调更新函数,从而更新视图。

实现方法: Watcher类有更新视图(update)的方法,实例化Watcher时,初始化调用时在Dep类上缓存该Watcher实例,并通过获取data中的属性值强制执行数据监听器里的get函数(get函数会通过Dep把Watcher订阅者添加到订阅池(subs)中)

上述是在仔细阅读这篇博客:www.cnblogs.com/canfoo/p/68…并亲自实践写了一个tinyVue后的个人总结。如果想要仔细研究的可以参考一下他的博客。

欢迎访问我的个人blog:www.front-end.xin/1169