Vue学习系列I——MVVM响应系统的基本实现原理
Model负责表示JavaScript对象,View负责UI界面显示,两者最大程度分离。
将模型和视图联系起来的是视图模型。ViewModel负责将模型的数据同步到视图中进行显示,也负责将视图的界面修改同步回模型更新数据。
脏值检查:angular.js通过脏值检查比较数据有无变化,决定是否更新视图。
原理是当内存中存储了copy_viewModel的副本时,当用户的操作导致viewModel发生变化时,框架会将Copy _ viewModel与最新的viewModel进行深度比较,一旦发现属性发生变化,就会重新渲染与之绑定的DOM节点。
最简单的方法是通过setInterval()定期轮询检测数据变化,角度触发时进入脏值检测。但是只允许指定的事件(如用户点击、输入操作、ajax请求、setInterval、setTimeout等...),否则需要手动调用apply函数强制脏检查。
数据劫持:vue.js采用数据劫持结合发布者-订阅者模式的方法,通过Object.defineProperty()劫持各种属性的setters。当数据发生变化时,getter向订阅者发布消息,触发相应的监控回调,从而更新数据和视图。
示意图告诉我们,数据属性定义getter和setter来劫持属性。当属性值发生变化时,会通知watch对象,watch对象会再次触发组件渲染函数,然后更新view上的DOM节点树。
另一方面,当在视图上输入数据时,它还会触发数据更改和订阅者观察更新,以便模型数据可以实时更新视图上的数据更改。这样的过程就是vue的数据双向绑定。
Vue通过数据劫持做数据绑定,核心方法是通过Object.defineProperty()劫持属性来监控数据变化。
Object.defineProperty是ES5的一个方法,可以直接在一个对象上定义一个新的属性,也可以修改一个已有的属性并返回该对象。对象中有两种主要形式的属性描述符:数据描述符和访问描述符。
数据描述符是具有可写或未写值的属性。
访问描述符是由一对getter-setter函数描述的属性。
描述符必须是两种形式之一;不能两者同时进行。也就是说,有值和可写,或者get和set。
属性描述符包括:
我们已经知道如何实现数据的双向绑定。首先要劫持和监控数据,所以需要设置一个监听观察器来监控所有的属性。如果属性发生了变化,您需要告诉订阅者观察器看看它是否需要更新。因为有很多订阅者,所以我们需要有一个消息订阅者Dep来收集这些订阅者,然后在侦听器观察者和订阅者观察者之间统一管理它们。然后,我们需要一个指令解析器Compile,它扫描并解析每个节点元素,将相应的指令初始化为订阅者观察器,并替换模板数据或绑定相应的函数。此时,当订阅者观察器接收到相应属性的变化时,它将执行相应的更新函数,从而更新视图。
因此,接下来,我们执行以下四个步骤来实现数据的双向绑定:
深度响应原理
分析Vue&的原理;实现双向绑定MVVM
响应系统的基本原理。射流研究…
我只想监控一个普通对象在JavaScript实现MVVM时的变化。