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 Array.prototype.slice使用说明
Oct 11 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
Aug 08 Javascript
如何让一个json文件显示在表格里【实现代码】
May 09 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
Sep 22 Javascript
基于JavaScript实现前端文件的断点续传
Oct 17 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
Jan 12 Javascript
Vue Router history模式的配置方法及其原理
May 30 Javascript
js中值引用和地址引用实例分析
Jun 21 Javascript
详解ECMAScript2019/ES10新属性
Dec 06 Javascript
javascript实现超好看的3D烟花特效
Jan 01 Javascript
vuecli项目构建SSR服务端渲染的实现
Oct 30 Javascript
Vue.Draggable实现交换位置
Apr 07 Vue.js
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_SELF的安全问题
2009/09/05 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
js判断变量是否未定义的代码
2020/03/28 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
web.py获取上传文件名的正确方法
2014/08/26 Python
python 产生token及token验证的方法
2018/12/26 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
python游戏地图最短路径求解
2019/01/16 Python
让你Python到很爽的加速递归函数的装饰器
2019/05/26 Python
python datetime中strptime用法详解
2019/08/29 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
大学生物业管理求职信
2013/10/24 职场文书
简单介绍Python的第三方库yaml
2021/06/18 Python
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏