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 相关文章推荐
比较详细的javascript对象的property和prototype是什么一种关系
Aug 06 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
Jul 31 Javascript
JS控制阿拉伯数字转为中文大写示例代码
Sep 04 Javascript
jquery带动画效果幻灯片特效代码
Aug 27 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
Sep 09 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
Jan 12 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
Jun 13 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
Aug 09 Javascript
jQuery实现CheckBox全选、全不选功能
Jan 11 Javascript
JS轮播图实现简单代码
Feb 19 Javascript
手写简单的jQuery雪花飘落效果实例
Apr 22 jQuery
实例详解Node.js 函数
Jun 10 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简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
PHP 地址栏信息的获取代码
2009/01/07 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
jQuery实现DIV层收缩展开的方法
2015/02/27 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
PyQt5每天必学之组合框
2018/04/20 Python
python实现多张图片拼接成大图
2019/01/15 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
Numpy 多维数据数组的实现
2020/06/18 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
什么是事务?为什么需要事务?
2012/01/09 面试题
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
《维生素c的故事》教学反思
2014/02/18 职场文书
政府门卫岗位职责
2014/04/29 职场文书
市场拓展计划书
2014/05/03 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
党的群众路线查摆剖析材料
2014/10/10 职场文书
卢旺达饭店观后感
2015/06/05 职场文书
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
2022/04/09 Javascript