Vue双向绑定学习

1mvvm模型

vue中就是用了mvvm模型的思想。mvvm模型相较于mvc模型的升级版。mvc模型即指model数据、view视图、controller控制器,通过controller来处理各种逻辑和用户交互。随着项目复杂度的上升,controller的逻辑和代码也越来越复杂,越来越难以维护就出现了mvvm模式。mvvm是controller变成了viewmodel,view和viewmodel双向绑定,互相影响。

mvvm模式的优点

1较低的耦合度,开发人员可以专注于逻辑和视图的开发,并且view和model不在直接影响

2减少dom操作,提高页面渲染性能

3保持了数据的一致性

             MVC模式                                            MMVC模式

2 数据属性

js中数据属性分为三种:
数据属性:拥有value和writable属性的对象,它有一个确定的值
访问器属性:可以通过getter或setter来访问和设值
内部属性:如_proto_这个就属于内部属性,每一个对象都具有。

数据属性和访问器属性是互斥的,设置了一边就不能设置另一边。数据属性和访问器属性还有两个共同的属性即enumerable和configurable。

在通过object.defineproperty方法定义时属性默认初始值:

value:underfined;      writable:false;        get:underfined;            set:underfined;        enumerable:false;         configurable:false;

value:设值属性的值。writable:设值属性是否可以修改值。get:设值属性返回的值。set:设值属性的值。enumerable:设值属性是否可以枚举,设值false的话for...in....就循环不到此属性。configurable:设值属性是否可重新配置描述符及可删除。

3Object.defineproperty方法

vue通过object.defineproperty方法来进行数据的劫持。defineproperty(obj,prop,descriptor)。通过get和set描述符来对要双向绑定的数据进行劫持。

4 双向模式模式

vue双向绑定是发布者订阅者模式,具体设置模式如下所示:

5模块作用

Observer: 递归遍历要劫持的对象的每一个属性里的每一个属性,为其添加上get和set描述符。get方法判断当前是否需要添加watch对象,set方法调用dep通知此对象的每一个观察者。

Dep:观察者管理器,可以添加观察者,和通知观察者

Watch:初始化,构造函数中获得vue实例,获得更新方法,获得自己需要观察的属性,获得当前值并设置当前Dep.target将自己添加到观察者队列中。并且调用获得Complie中更新dom方法更新方法更新视图。

Complie:解析器。获得vue中el名称和vue实例。根据el名称获得dom,并根据dom生成fragement便于后续频繁操作(类似于diff算法中虚拟dom)。递归解析生成的Fragement中的每一个节点和节点的节点。。。,根据nodetype判断是否是元素节点,是进入元素节点操作还是进入文本节点工作。进入文本节点,根据vue实例初始化视图,在生成watch对象绑定vue实例和属性和更新方法。进入元素节点,获得node属性判断是否有指令,如v-model或v-on,若是事件指令,进入事件指令绑定方法,获得要绑定的时间如change或click等等,调用addeventlistener来给此node节点绑定;若是model指令则进入model指令更新方法,先获取数据初始化视图,在生成watch对象,若是input或其他元素,需要在监听元素的input时间来通过视图更新model.

MyVue:vue对象,接收el、data、methods、mounted等属性,调用object.defineproperty方法来对vue实例中data进行代理,达到直接访问this.prop而不是访问this.data.prop的效果。对data属性调用observe来劫持观测,对el调用complie来解析dom和更新方法,并初始化视图。直接调用mouted方法来达成初始化完毕调用此方法的效果。

6双向绑定代码流程

初始化流程:黑色

数据更新流程:红色

视图更新流程:蓝色

参考文献

1https://www.jianshu.com/p/8fe1382ba135

2https://www.cnblogs.com/chenhuichao/p/10818396.html

 

猜你喜欢

转载自blog.csdn.net/qq_39692513/article/details/108798216
今日推荐