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 相关文章推荐
麻雀虽小五脏俱全 Dojo自定义控件应用
Sep 04 Javascript
jQuery实现复选框批量选择与反选的方法
Jun 17 Javascript
基于React.js实现原生js拖拽效果引发的思考
Mar 30 Javascript
jQuery插件ajaxFileUpload异步上传文件
Oct 19 Javascript
使用clipboard.js实现复制功能的示例代码
Oct 16 Javascript
JS正则表达式常见用法实例详解
Jun 19 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
Sep 03 Javascript
详解Vue底部导航栏组件
May 02 Javascript
详解Node.js异步处理的各种写法
Jun 09 Javascript
深入学习js函数的隐式参数 arguments 和 this
Jun 24 Javascript
Javascript中Microtask和Macrotask鲜为人知的知识点
Apr 02 Javascript
JavaScript模拟实现网易云轮播效果
Apr 04 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实现网上点歌(二)
2006/10/09 PHP
php 应用程序安全防范技术研究
2009/09/25 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
JS学习之一个简易的日历控件
2010/03/24 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
js中this用法实例详解
2015/05/05 Javascript
Javascript实现字数统计
2015/07/03 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
微信小程序中多个页面传参通信的学习与实践
2017/05/05 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
2019/05/29 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
Tensorflow简单验证码识别应用
2017/05/25 Python
Python中进程和线程的区别详解
2017/10/29 Python
python中set()函数简介及实例解析
2018/01/09 Python
Python实现动态图解析、合成与倒放
2018/01/18 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
Python tornado上传文件的功能
2020/03/26 Python
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
SmartBuyGlasses美国官网:太阳眼镜和眼镜
2017/08/20 全球购物
团组织关系介绍信
2014/01/12 职场文书
2014年人事科工作总结
2014/11/19 职场文书
优秀教研组申报材料
2014/12/26 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书