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 相关文章推荐
artdialog的图片/标题以及关闭按钮不显示的解决方法
Jun 27 Javascript
图片动画横条广告带上下滚动的JS代码
Oct 25 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
Mar 05 Javascript
jquery 中ajax执行的优先级
Jun 22 Javascript
全面解析Bootstrap排版使用方法(标题)
Nov 30 Javascript
javascript禁止超链接跳转的方法
Feb 02 Javascript
ES6中非常实用的新特性介绍
Mar 10 Javascript
微信小程序排坑指南详解
May 23 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
Oct 27 Javascript
微信小程序页面间传递数组对象方法解析
Nov 06 Javascript
JS正则表达式验证端口范围(0-65535)
Jan 06 Javascript
快速解决element的autofocus失效问题
Sep 08 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
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
jquery入门—访问DOM对象方法
2013/01/07 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
Vue.JS入门教程之事件监听
2016/12/01 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
vue axios重复点击取消上一次请求封装的方法
2019/06/19 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
python求解水仙花数的方法
2015/05/11 Python
利用aardio给python编写图形界面
2017/08/21 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
详解python做UI界面的方法
2019/02/27 Python
python多线程扫描端口(线程池)
2019/09/04 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
应届行政管理专业个人自我评价
2013/12/28 职场文书
2016七夕情人节广告语
2016/01/28 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
如何基于python实现单目三维重建详解
2022/06/25 Python
python高温预警数据获取实例
2022/07/23 Python
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL