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 相关文章推荐
js 如何实现对数据库的增删改查
Nov 23 Javascript
javascript引用类型之时间Date和数组Array
Aug 27 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
Apr 26 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
Aug 15 Javascript
移动开发之自适应手机屏幕宽度
Nov 23 Javascript
jquery ui sortable拖拽后保存位置
Apr 27 jQuery
微信小程序之电影影评小程序制作代码
Aug 03 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
Dec 18 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
Sep 14 Javascript
小程序实现列表多个批量倒计时
Jan 29 Javascript
微信小程序如何调用json数据接口并解析
Jun 29 Javascript
vue解决花括号数据绑定不成功的问题
Oct 30 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
截获网站title标签之家内容的例子
2006/10/09 PHP
phpMyadmin 用户权限中英对照
2010/04/02 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
js对象的复制继承实例
2015/01/10 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
Express的路由详解
2015/12/10 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
win10下python3.5.2和tensorflow安装环境搭建教程
2018/09/19 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
python打开音乐文件的实例方法
2020/07/21 Python
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
C有"按引用传递"吗
2016/09/06 面试题
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
询价采购方案
2014/06/09 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
社区母亲节活动总结
2015/02/10 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python