Vue的双向绑定特性一直广受人们欢迎,可是你们知道实现双向绑定的原理吗?这篇文章将给你们介绍实现双向绑定的原理。前端
原文戳我vue
MVC即Model-View-Controller的缩写,就是模型-视图-控制器 , 也就是说一个标准的Web 应用程序是由这三部分组成的。git
Model:管理数据。
View:UI布局,展现数据。
Controller:响应用户操做,并将Model更新到 View 上。github
这种MVC架构模式对于简单的应用来看起是OK的,也符合软件架构的分层思想。 但实际上,随着H5 的不断发展,人们更但愿使用H5开发的应用能和Native媲美,或者接近于原生App的体验效果,因而前端应用的复杂程度已不一样往日,今非昔比。这时前端开发就暴露出了三个痛点问题:数组
Model:表明数据模型,也能够在Model中定义数据修改和操做的业务逻辑。 View:表明UI组件,它负责将数据模型转化成UI 展示出来。 ViewModel:是一个同步View 和 Model的对象。架构
在MVVM架构下,View和Model之间并无直接的联系,而是经过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 所以View 数据的变化会同步到Model中,而Model 数据的变化也会当即反应到View 上。函数
ViewModel经过双向数据绑定把View层和Model层链接了起来,而View和Model之间的同步工做彻底是自动的,无需人为干涉,所以开发者只需关注业务逻辑,不须要手动操做DOM,不须要关注数据状态的同步问题,复杂的数据状态维护彻底由MVVM来统一管理。布局
简单来讲就是用户更新了视图,Model也随之更新就称为双向绑定。再说细点,就是在单向绑定的基础上给可输入元素(input、textare等)添加了change(input)事件,(change事件触发,View的状态就被更新了)来动态修改model。性能
Observer: 数据监听器,可以对数据对象的全部属性进行监听,若有变更可拿到最新值并通知订阅者,内部采用Object.defineProperty的getter和setter来实现。
Dep:消息订阅器,内部维护了一个数组,用来收集订阅者(Watcher),数据变更触发notify 函数,再调用订阅者的 update 方法。
Watcher:订阅者,做为链接Observer和Compile的桥梁,可以订阅并收到每一个属性变更的通知,执行指令绑定的相应回调函数。
Compile:指令解析器,它的做用对每一个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数。.net