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 密码强弱度检测万能插件
Feb 25 Javascript
javascript 装载iframe子页面,自适应高度
Mar 20 Javascript
javascript innerText和innerHtml应用
Jan 28 Javascript
javascript搜索框效果实现方法
May 14 Javascript
浅析AngularJS中的生命周期和延迟处理
Jun 18 Javascript
实例详解ECMAScript5中新增的Array方法
Apr 05 Javascript
Vue.js学习笔记之 helloworld
Aug 14 Javascript
vue中实现左右联动的效果
Jun 22 Javascript
微信小程序如何实现全局重新加载
Jun 05 Javascript
基于Vue SEO的四种方案(小结)
Jul 01 Javascript
Vue-cli打包后如何本地查看的操作
Sep 02 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
Nov 09 Javascript
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
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
关于vue-resource报错450的解决方案
2017/07/24 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
Python实现提取谷歌音乐搜索结果的方法
2015/07/10 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
《学会待客》教学反思
2014/02/22 职场文书
园艺师求职信
2014/04/27 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
给老婆的道歉信
2015/01/20 职场文书
考察邀请函范文
2015/01/31 职场文书
前台接待岗位职责
2015/02/03 职场文书
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python