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 获取页面元素的位置的代码
Sep 25 Javascript
jQuery each()方法的使用方法
Mar 18 Javascript
JS实现淘宝幻灯片效果的实现方法
Mar 22 Javascript
jquery通过visible来判断标签是否显示或隐藏
May 08 Javascript
JavaScript中实现依赖注入的思路分享
Jan 15 Javascript
Bootstrap table分页问题汇总
May 30 Javascript
很棒的一组js图片轮播特效
Jan 12 Javascript
JS图片轮播与索引变色功能实例详解
Jul 06 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
Jan 08 Javascript
qrcode生成二维码微信长按无法识别问题的解决
Apr 04 Javascript
微信小程序服务器日期格式化问题
Jan 07 Javascript
详解Vue中的watch和computed
Nov 09 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
PHP5 安装方法
2006/10/09 PHP
基于mysql的论坛(5)
2006/10/09 PHP
一个简洁的多级别论坛
2006/10/09 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
python3抓取中文网页的方法
2015/07/28 Python
详解在Python程序中自定义异常的方法
2015/10/16 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
python生成密码字典的方法
2018/07/06 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
亿企通软件测试面试题
2012/04/10 面试题
教师自我鉴定范文
2014/03/20 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android
Java界面编程实现界面跳转
2022/06/16 Java/Android