前言:
当被问到 Vue 数据双向绑定原理的时候,大家可能都会脱口而出:Vue 内部通过Object.defineProperty方法属性拦截的方式,把 data 对象里每个数据的读写转化成 getter/setter,当数据变化时通知视图更新。
首先我们应该了解一下MVVM
MVVM 数据双向绑定主要是指:数据变化更新视图,视图变化更新数据。相信大家对MVVM是有一定了解的。
那么它是怎么实现的呢?
当输入框内容变化时,Data中的数据同步变化。即View=>Data的变化。
Data中的数据变化时,文本节点的内容同步变化。即Data=>View的变化。
其中,View变化更新Data,可以通过事件监听的方式来实现,所以我们本文主要讨论如何根据Data变化更新View。
1、实现一个监听器Observer,用来劫持并监听所有属性,如果属性发生变化,就通知订阅者;
2、实现一个订阅器Dep,用来收集订阅者,对监听器Observer和 订阅者Watcher进行统一管理;
3、实现一个订阅者Watcher,可以收到属性的变化通知并执行相应的方法,从而更新视图;
4、实现一个解析器Compile,可以解析每个节点的相关指令,对模板数据和订阅器进行初始化。
Object.defineProperty(obj, prop, descriptor)
obj
要在其上定义属性的对象。
prop
要定义或修改的属性的名称。
descriptor
将被定义或修改的属性描述符。
总结:
其实我们应该从用户的角度去理解双向绑定,首先用户在输入的时候,就激活了setter。每一个组件内部都有一个
Watcher,当Watcher检测到变化时,会值传入组件内部的getter中,也就是data() 函数中,然后重新去渲染页面,实现数据的双向绑定。