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 相关文章推荐
document.compatMode介绍
May 21 Javascript
JavaScript 新手24条实用建议[TUTS+]
Jun 21 Javascript
JS.elementGetStyle(element, style)应用示例
Sep 24 Javascript
使用JQuery实现的分页插件分享
Nov 05 Javascript
基于jquery实现的仿优酷图片轮播特效代码
Jan 13 Javascript
微信小程序getPhoneNumber获取用户手机号
Sep 29 Javascript
js读取本地文件的实例
Dec 22 Javascript
基于wordpress的ajax写法详解
Jan 02 Javascript
微信小程序开发背景图显示功能
Aug 08 Javascript
Node 搭建一个静态资源服务器的实现
May 20 Javascript
微信小程序 调用微信授权窗口相关问题解决
Jul 25 Javascript
laypage.js分页插件使用方法详解
Jul 27 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获取mysql版本的几种方法小结
2008/03/25 PHP
php实现jQuery扩展函数
2009/10/30 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
『jQuery』.html(),.text()和.val()的概述及使用
2013/04/22 Javascript
js文本框输入点回车触发确定兼容IE、FF等
2013/11/19 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
2016/05/27 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
Bootstrap Table使用整理(一)
2017/06/09 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
python的socket编程入门
2018/01/29 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
jupyter notebook 重装教程
2020/04/16 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
利用CSS3的3D效果制作正方体
2020/03/10 HTML / CSS
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
ajax是什么及其工作原理
2012/02/08 面试题
倡议书范文
2014/04/16 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
2014年食堂工作总结
2014/11/20 职场文书