大数据遍历导致页面无响应_Vue2.x 和 Vue3.0 实现响应式数据对比

我们知道 Vue2.x 版本使用了 ES5 中的 Object.defineProperty 方法来实现响应式数据(数据双向绑定)。

实现原理:

afe415906f2a0f763da92aba7724d61a.png

如上图所示,存在数据data,遍历data。当获取data中任意属性值时,便执行get方法  控制台会打印出结果。

当给data中任意属性设置值时,便执行set方法控制台打印出最新的值

9b6928a125630f234d5a05713dcc611c.png

举个栗子

d068420fd8e80dce75623b7dd5dfd454.png

386d89c6f46ea82d50221d390cb80ac0.gif

当我们修改已存在的属性 name 和 color 时,页面显示发生了改变实现了数据响应,但当添加一个不存在 price 属性并赋值时,页面的‘价格’并没有成功被赋值,这就是 defineProperty 存在的问题,无法实时监测到添加或删除一个属性。不过vue已经通过内置方法$set,$delect 等解决了这个问题。

874ea539588479db34d47215ff532a2a.png

删除属性同理,使用 $delete,页面‘颜色’值消失,实现数据响应式

d88afe2fef8794c612997b0525cbd743.png

其中 defineProperty 对于数组下标和length属性的操作,也存在一些问题

1c406b6e2c175854b95bc997f2b9f5fd.png

直接通过下标方式添加一项值页面DOM并未改变

65b9c507c78f7b4ef7bd6fdb042e6df8.png

使用 $set 和 数组的方法就实现了

efed21f7049e1a8dd989857e8ae3a278.png

总结

存在缺点:

  •  Object.defineProperty  无法监测到对象属性动态的添加和删除

  •  Object.defineProperty  无法监测到数组下标和length属性的变更

解决方案:

  • Vue 提供了 $set 方法用于动态给对象添加属性

  • Vue 提供了 $delete 方法用于动态删除对象属性

  • 重写vue中数组方法,用于监测数组的变更


Vue3.0抛弃了 Object.defineProperty 方法,使用ES6新增的 proxy 语法来实现响应式数据。

实现原理

57d2ee0368f7c67739c6acfc35c5124a.png

当操作proxyData代理对象时,可以获取,可以设置,可以新增,可以删除

增删改查都能实现 

ba315a9ba6eb1cd4fbf8bdfc7bf05b8e.png

举个栗子

27dfc43059438ac368847e4fff17f291.png

我们在对data数据进行增删改查时,完全没有问题,并不需要特殊处理

2321f9a907c0c7c8f4aa3dfc58809399.gif

即使面对数组也可是通过下标添加一个新的值

2bffb6343fcff4495c4ee96dd4170b72.png

总结

优点:

  •  proxy  可以监测到对象属性动态的添加和删除

  •  proxy  可以监测到数组下标和length属性的变更

  • 相对defineProperty 需要对数据遍历循环,proxy  的执行速度效率大大提升

存在缺点:

  • proxy  语法是ES6新出的功能,对于低版本浏览器不支持,不过vue3.0会针对IE11出一个特殊的版本来解决这个问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值