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增删元素的代码
Feb 14 Javascript
在js文件中如何获取basePath处理js路径问题
Jul 10 Javascript
JavaScript中的splice()方法使用详解
Jun 09 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
Dec 10 Javascript
AngularJS中transclude用法详解
Nov 03 Javascript
jQuery向webApi提交post json数据
Jan 16 Javascript
详解JavaScript中return的用法
May 08 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
Nov 29 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
Jan 25 Javascript
微信小程序实现图片上传功能
May 28 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
Sep 28 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
Aug 03 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
PHP语法速查表
2006/12/06 PHP
队列在编程中的实际应用(php)
2010/09/04 PHP
js两行代码按指定格式输出日期时间
2011/10/21 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
jQuery回车实现登录简单实现
2013/08/20 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
2016/04/26 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
微信小程序 页面跳转传参详解
2016/10/28 Javascript
理解javascript中的闭包
2017/01/11 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
vue实现循环切换动画
2018/10/17 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
Python多线程编程(五):死锁的形成
2015/04/05 Python
Python Web框架Tornado运行和部署
2020/10/19 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
天网面试题
2013/04/07 面试题
法警的竞聘演讲稿
2014/01/02 职场文书
财务人员的自我评价范文
2014/03/03 职场文书
毕业生欢送会主持词
2014/03/31 职场文书
读书活动总结范文
2014/04/26 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
销售会议开幕词
2015/01/28 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
关于python类SortedList详解
2021/09/04 Python