Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)


Posted in Javascript onNovember 22, 2016

我在整理javascript高级程序设计的笔记的时候看到面向对象设计那章,讲到对象属性分为数据属性和访问器属性,我们平时用的js对象90%以上都只是用到数据属性;我们向来讲解下数据属性和访问器属性到底是什么?

数据属性:数据属性包含一个数据值的位置,在这个位置可以读取和写入值.

访问器属性:访问器属性不包含数据值;他们包含一对getter和setter函数在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值,在写入访问器属性时,会调用setter函数并传入新值.

这里介绍的重点是访问器属性,设置对象的访问器属性只能用es5的Object.defineProrerty()方法,如下例子:

var book={
_year:2004,
edition:1
};
Object.defineProperty(book,"year",{
get:function () {
return this._year
},
set:function (newValue) {
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
}
}
});
book.year=2005;
alert(book.edition);//2
console.log(book.year);//2005

也就是当执行book.year=2005的时候其实是执行了year中的set方法,当执行book.year的时候执行了year的get方法;

var book={
_year:2004,
edition:1
};
Object.defineProperty(book,"year",{
get:function () {
console.log("year get")
return this._year
},
set:function (newValue) {
console.log("year set")
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
}
}
});
book.year=2005;
alert(book.year);

控制台的提示是:

Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)

这个原理就是vue双向数据绑定的原理,我们在vue组件中的data声明属性数据的时候其实在对象中的已经将这个属性封装成了访问器属性.

Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)

每个属性都有get和set方法,在做双向的数据的控制都在get和set方法中,因为无论你是在ready(2.0是mounted了)或是在view中改变值都会触发set方法,将新值复制进去,在重新在view中匹配值,当然你们有更复杂的控制操作,get方法着是让ready中获取的这个属性值一直保存最新值.

angular1的双向数据绑定是脏数据监测,简单点说就是监测新值和旧值有没有变化,这种方式就要定时监测了咯.两种性能的消耗感觉不在一个层次上的啊.

就好比用html5 Sockets做后台主动消息推送前端和用js定时器每个5秒发送请求到后台捕获消息的性能差距一样.

还有之前写的js面向对象分层的思想其实也可以用在vue项目中,以前我一直以为vue的data层其实就是个摆设,但在api发现computed属性之后data层完全可以实现发送ajax取数功能,没必要在全都放到ready(2.0是mounted了)里面,这个ready(2.0是mounted了)可以只负责数据格式出来,或者控制页面的动态效果而已.这js的结构就像后台MVC那样层次功能分明清晰.这也只是我突然想到的思路还没真正应用到实际项目中,只是给在用vue的朋友提供个思路.

import data from '../assets/js/data'
export default{
data(){
return{
menu:data.menu,
inde:"",
row:"",
clomu:""
}
},
computed:{
isfull:function () {
alert(111);
return 11;
}
},
mounted(){
},
methods:{
domclick:function (i) {
if(this.inde===i){
this.inde="";
}else {
this.inde = i;
}
},
subclick:function (i,o) {
this.row=i;
this.clomu=o;
}
}
}

以上所述是小编给大家介绍的Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Javascript的匿名函数小结
Dec 31 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
Feb 23 Javascript
javascript中加号(+)操作符的一些神奇作用
Jun 06 Javascript
jquery的attr方法禁用表单元素禁用输入内容
Jun 23 Javascript
javascript制作的cookie封装及使用指南
Jan 02 Javascript
javascript作用域、作用域链(菜鸟必看)
Jun 16 Javascript
微信小程序 wxapp画布 canvas详细介绍
Oct 31 Javascript
原生javascript实现图片放大镜效果
Jan 18 Javascript
JS实现的Unicode编码转换操作示例
Apr 28 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
May 26 Javascript
基于JS实现带动画效果的流程进度条
Jun 01 Javascript
jquery实现简单拖拽效果
Jul 20 jQuery
AngularJS全局scope与Isolate scope通信用法示例
Nov 22 #Javascript
基于js实现checkbox批量选中操作
Nov 22 #Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
Nov 22 #Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
Nov 22 #Javascript
详解Js模板引擎(TrimPath)
Nov 22 #Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
Nov 22 #Javascript
AngularJS中指令的四种基本形式实例分析
Nov 22 #Javascript
You might like
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
Laravel 登录后清空COOKIE的操作方法
2019/10/14 PHP
一个js实现的所谓的滑动门
2007/05/23 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
jquery操作复选框checkbox的方法汇总
2015/02/05 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
BootStrap树状图显示功能
2016/11/24 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
vuejs实现标签选项卡动态更改css样式的方法
2018/05/31 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
使用python实现baidu hi自动登录的代码
2013/02/10 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
python批量处理txt文件的实例代码
2020/01/13 Python
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
电气自动化自荐信
2013/10/10 职场文书
《猫》教学反思
2014/02/26 职场文书
春游踏青活动方案
2014/08/14 职场文书
世界红十字日活动总结
2015/02/10 职场文书
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL