vue3.0中的双向数据绑定方法及优缺点


Posted in Javascript onAugust 01, 2019

熟悉vue的人都知道在vue2.x之前都是使用object.defineProperty来实现双向数据绑定的

而在vue3.0中这个方法被取代了

1. 为什么要替换Object.defineProperty

替换不是因为不好,是因为有更好的方法使用效率更高

Object.defineProperty的缺点:

1. 在Vue中,Object.defineProperty无法监控到数组下标的变化,

导致直接通过数组的下标给数组设置值,不能实时响应。

push()
pop()
shift()
unshift()
splice()
sort()
reverse()

2. Object.defineProperty只能劫持对象的属性,因此我们需要对每个对象的每个属性进行遍历。

Vue里,是通过递归以及遍历data对象来实现对数据的监控的,

如果属性值也是对象那么需要深度遍历,显然如果能劫持一个完整的对象,不管是对操作性还是性能都会有一个很大的提升。

而要取代它的Proxy有以下两个优点:

1. 可以劫持整个对象,并返回一个新对象
2. 有13种劫持操作

2. 什么是Proxy

Proxy是 ES6 中新增的一个特性,翻译过来意思是"代理",用在这里表示由它来“代理”某些操作。 Proxy 让我们能够以简洁易懂的方式控制外部对对象的访问。其功能非常类似于设计模式中的代理模式。

Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。

使用 Proxy 的核心优点是可以交由它来处理一些非核心逻辑(如:读取或设置对象的某些属性前记录日志;设置对象的某些属性值前,需要验证;某些属性的访问控制等)。 从而可以让对象只需关注于核心逻辑,达到关注点分离,降低对象复杂度等目的。

基本用法:

let p = new Proxy(target, handler);

参数:

target: 是用Proxy包装的被代理对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
handler: 是一个对象,其声明了代理target 的一些操作,其属性是当执行一个操作时定义代理的行为的函数。

p是Proxy对象,当其他操作对p进行更改的时候,会执行handler对象的方法。Proxy有13种数据劫持的操作,常用的handler处理方法:

get: 读取值,
set: 获取值,
has: 判断对象是否拥有该属性,
construct: 构造函数

举个例子:

let obj = {};
 let handler = {
  get(target, property) {
  console.log(`${property} 被读取`);
  return property in target ? target[property] : 3;
  },
  set(target, property, value) {
  console.log(`${property} 被设置为 ${value}`);
  target[property] = value;
  }
 }
 let p = new Proxy(obj, handler);
 p.name = 'tom' //name 被设置为 tom
 p.age; //age 被读取 3

更多的Proxy属性方法参考MDN Proxy

3. Proxy实现数据劫持

observe(data) {
 const that = this;
 let handler = {
  get(target, property) {
   return target[property];
  },
  set(target, key, value) {
   let res = Reflect.set(target, key, value);
   that.subscribe[key].map(item => {
    item.update();
   });
   return res;
  }
 }
 this.$data = new Proxy(data, handler);
}

这段代码里把代理器返回的对象代理到this.$data,即this.$data是代理后的对象,外部每次对this.$data进行操作时,实际上执行的是这段代码里handler对象上的方法。

注:这儿用到了reflect属性,这也是ES6里面的,不知道的去这儿看看吧。reflect属性

总结

以上所述是小编给大家介绍的vue3.0中的双向数据绑定方法及优缺点,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
基于jQuery的日期选择控件
Oct 27 Javascript
Textarea与懒惰渲染实现代码
Jan 04 Javascript
javascript 判断中文字符长度的函数代码
Aug 27 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
Jul 09 Javascript
关于javascript模块加载技术的一些思考
Nov 28 Javascript
js如何打印object对象
Oct 16 Javascript
Jquery为DIV添加click事件的简单实例
Jun 02 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
Feb 22 Javascript
微信小程序 request接口的封装实例代码
Apr 26 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
Jun 18 Javascript
Vue CLI3 如何支持less的方法示例
Aug 29 Javascript
js实现打字小游戏
Dec 17 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
Aug 01 #Javascript
微信小程序使用Vant Weapp组件库的方法步骤
Aug 01 #Javascript
微信小程序中button去除默认的边框实例代码
Aug 01 #Javascript
vue-router两种模式区别及使用注意事项详解
Aug 01 #Javascript
jQuery中DOM常见操作实例小结
Aug 01 #jQuery
JS浮点数运算结果不精确的Bug解决
Aug 01 #Javascript
微信小程序动画组件使用解析,类似vue,且更强大
Aug 01 #Javascript
You might like
利用static实现表格的颜色隔行显示
2006/10/09 PHP
php MsSql server时遇到的中文编码问题
2009/06/11 PHP
求PHP数组最大值,最小值的代码
2011/10/31 PHP
PHP Class&Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
php查询ip所在地的方法
2014/12/05 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
Python实现k-means算法
2018/02/23 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
python如何实现视频转代码视频
2019/06/17 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
详解如何修改python中字典的键和值
2020/09/29 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
Linux中如何用命令创建目录
2016/12/02 面试题
信息学院毕业生自荐信范文
2014/03/04 职场文书
洗发露广告词
2014/03/14 职场文书
个人租房协议书范本
2014/09/30 职场文书
教师党员批评与自我批评发言稿
2014/10/15 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书