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 相关文章推荐
Js 回车换行处理的办法及replace方法应用
Jan 24 Javascript
js验证电话号码与手机支持+86的正则表达式
Jan 23 Javascript
input:checkbox多选框实现单选效果跟radio一样
Jun 16 Javascript
jQuery实现图片渐入渐出切换展示效果
Aug 15 Javascript
关于网页中的无缝滚动的js代码
Jun 09 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
Jun 12 Javascript
jquery动态添加文本并获取值的方法
Oct 12 Javascript
JS回调函数简单用法示例
Feb 09 Javascript
vue2.0构建单页应用最佳实战
Apr 01 Javascript
Webpack如何引入bootstrap的方法
Jun 17 Javascript
js滚轮事件 js自定义滚动条的实现
Jan 18 Javascript
微信小程序绘制半圆(弧形)进度条
Nov 18 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
微信公众平台DEMO(PHP)
2016/05/04 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
javascript 尚未实现错误解决办法
2008/11/27 Javascript
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
非常漂亮的相册集 使用jquery制作相册集
2016/04/28 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
微信小程序 标签传入数据
2017/05/08 Javascript
python的正则表达式re模块的常用方法
2013/03/09 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
Python流程控制 if else实现解析
2019/09/02 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
Python timeit模块的使用实践
2020/01/13 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
医院护士专业个人的求职信
2013/12/09 职场文书
见习期自我鉴定
2014/01/31 职场文书
物流创业计划书
2014/02/01 职场文书
庆祝儿童节标语
2014/10/09 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL
nginx之queue的具体使用
2022/06/28 Servers
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python