数据的双向绑定
当数据发生变化,ViewModel可能监听到数据的这种变动,而后告诉到对应的视图做自动更新,而当用户操作视图,ViewModel 也能监听到视图的变动,而后告诉数据做改变,这实际上就实现了数据的双向绑定
- Vue.js 是采纳 Object.defineProperty 的 getter 和 setter ,并联合 观察者模式 来实现数据绑定的。
- 当把一个一般 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,并用Object.defineProperty()办法把它们转化为 getter/setter办法。当data中的属性被拜访时,则会调用getter办法;当data中的属性被扭转时,则会调用setter办法
- 名词解释
- 监听器 Observer :利用 Object.defineProperty() 对属性都加上 setter 和 getter实现数据劫持
- 解析器 Compile :解析 Vue 模板指令,将模板中的变量都替换成数据,而后初始化渲染页面视图
- 订阅者 Watcher :Watcher 订阅者是 Observer 和 Compile 之间通信的桥梁 ,次要的工作是订阅 Observer 中的属性值变动的音讯,当收到属性值变动的音讯时,触发解析器 Compile 中对应的更新函数。
- 订阅器 Dep :用来收集订阅者 Watcher,对监听器 Observer 和 订阅者 Watcher 进行对立治理。
详解( 参考链接)
- 首先咱们须要设置一个 监听器Observer , 对数据对象进行遍历,包含子属性对象的属性,利用 Object.defineProperty() * 对属性都加上 setter 和 getter* 。这样的话,给这个对象的某个值赋值,就会触发 setter,那么就能监听到了数据变动 。如果属性发上变动了,就须要通知订阅者Watcher看是否须要更新。
- 因为订阅者是有很多个,所以咱们须要有一个 音讯订阅器Dep 来专门收集这些订阅者,而后在监听器Observer和订阅者Watcher之间进行对立治理的。
- 接着,咱们还须要有一个 指令解析器Compile , 解析 Vue 模板指令,将模板中的变量都替换成数据,而后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,增加监听数据的订阅者,一旦数据有变动, 订阅者Watcher 收到告诉,调用更新函数进行数据更新
- 此时当 订阅者Watcher 接管到相应属性的变动,就会执行对应的更新函数,从而更新视图。
欢送留言~~~