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 相关文章推荐
选择TreeView控件的树状数据节点的JS方法(jquery)
Feb 06 Javascript
JS定义回车事件(实现代码)
Jul 08 Javascript
javascript使用输出语句实现网页特效代码
Aug 06 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
Mar 08 Javascript
利用vue.js插入dom节点的方法
Mar 15 Javascript
用vue封装插件并发布到npm的方法步骤
Oct 18 Javascript
解决vue打包项目后刷新404的问题
Mar 06 Javascript
原生JS实现简单的倒计时功能示例
Aug 30 Javascript
微信小程序登录session的使用
Mar 17 Javascript
vue element自定义表单验证请求后端接口验证
Dec 11 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
Apr 20 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
Jul 24 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的SQL注入过程分析
2012/01/06 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
javascript每日必学之循环
2016/02/19 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
深入研究React中setState源码
2017/11/17 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
python从入门到精通(DAY 3)
2015/12/20 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
django 修改server端口号的方法
2018/05/14 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
python变量的存储原理详解
2019/07/10 Python
简单了解python变量的作用域
2019/07/30 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
2021/02/01 Python
Flask中jinja2的继承实现方法及实例
2021/03/03 Python
医学检验专业个人求职信范文
2013/12/04 职场文书
致短跑运动员广播稿
2014/01/09 职场文书
致跳远、跳高运动员广播稿
2014/01/09 职场文书
法院先进个人事迹材料
2014/05/04 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
出差报告怎么写
2014/11/06 职场文书
2015年教师新年寄语
2014/12/08 职场文书
win10清理dns缓存
2022/04/19 数码科技