vue数据双向绑定原理解析(get & set)


Posted in Javascript onMarch 08, 2017

前端的数据双向绑定指的是view(视图)和model(数据)两者之间的关系;view层是页面上展示给用户看的信息,model层一般是指通过http请求从后台返回的数据。view到model的绑定都是通过事件回调函数操作的,model到view的绑定有多种方法。

angular,react,vue等mv*模式的框架都实现了数据双向绑定;angular是通过脏检查即新老数据的比较来确定哪些数据发生了变化,从而将它更新到view中;vue则是通过设置数据的get和set函数来实现的,这种方式在性能上是优于angular的。

下面代码是一个简单的定义数据get和set方法的例子,set和get方法分别在数据改变和访问的时候被调用,能够监听数据的变化:

// 数据绑定的构造函数
function Observer(data) {
 this.data = data;

 for(var key in data) {
  if(data.hasOwnProperty(key)) {
   var val = data[key];
   if(typeof data[key] === "object"){
    // 如果值不为原始类型,则继续递归
    new Observer(val);
   }else {
    this.convert(key, val);
   }
  }
 }
}
// 定义set 和 get函数
Observer.prototype.convert = function(key, val) {
 Object.defineProperty(this.data, key, {
  enumerable: true,
  confingurable: true,
  get: function() {
   console.log(key + "被访问了");
   return val;
  },
  set: function(newVal) {
   console.log(key + "被设置了新值" + newVal);
   val = newVal;
  }
 });
}
var app = new Observer({name: "xieshuai", age: 24, address: {city: "shenzheng"}});

app.data.name;  // name被访问了
app.data.age = 18; // age被设置了新值18

Object.defineProperty,这是ES6新增的方法,通过这个方法,可以自定义getter和setter函数。

上面的代码只是个简单的例子,并没有处理数组的情况;不过这是vue实现数据双向绑定的核心。

本文到此结束,文中若有不对之处,还望指正。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一步一步教你写一个jQuery的插件教程(Plugin)
Sep 03 Javascript
jquery中防刷IP流量软件影响统计的一点对策
Jul 10 Javascript
JavaScript中Function详解
Feb 27 Javascript
JS基于面向对象实现的放烟花效果
May 07 Javascript
jQuery聚合函数实例
May 21 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
Sep 18 Javascript
JS实现简易换图时钟功能分析
Jan 04 Javascript
vue-cli 目录结构详细讲解总结
Jan 15 Javascript
vue写h5页面的方法总结
Feb 12 Javascript
d3.js实现图形拖拽
Dec 19 Javascript
JS window对象简单操作完整示例
Jan 14 Javascript
JavaScript 闭包的使用场景
Sep 17 Javascript
footer定位页面底部(代码分享)
Mar 07 #Javascript
vue父子组件的数据传递示例
Mar 07 #Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
Mar 07 #Javascript
完美实现js焦点轮播效果(一)
Mar 07 #Javascript
Vue2.0组件间数据传递示例
Mar 07 #Javascript
js实现网页定位导航功能
Mar 07 #Javascript
Vuejs 组件——props数据传递的实例代码
Mar 07 #Javascript
You might like
解决php中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
在javascript中创建对象的各种模式解析
2016/05/16 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
js实现电灯开关效果
2021/01/19 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
python多线程共享变量的使用和效率方法
2019/07/16 Python
Python日期格式和字符串格式相互转换的方法
2020/02/18 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
降低python版本的操作方法
2020/09/11 Python
python代码实现图书管理系统
2020/11/30 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
护理专业自荐书
2014/06/04 职场文书
单位委托书怎么写
2014/09/21 职场文书
出资证明书范本(标准版)
2014/09/24 职场文书
关于学习的决心书
2015/02/05 职场文书
行政司机岗位职责
2015/04/10 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
病房管理制度范本
2015/08/06 职场文书
运动会广播稿50字
2015/08/19 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL