vue无法监听数组的变化,vue2为什么监听不到数组

  vue无法监听数组的变化,vue2为什么监听不到数组

  由于某些限制,vue2在某些情况下无法检测数组变化。本文将详细解释这两个限制的解决方案。

  

目录

  解决方案Vue2.0为什么不能监控两个数组的变化?

  源代码分析

  Vue3.0

  由于JavaScript的限制,Vue无法检测到以下数组的变化:

  直接按索引设置数组项时,例如:vm.items[indexOfItem]=newValue

  修改数组长度时,例如:vm.items.length=newLength

  var vm=new Vue({

  数据:{

  项目:[a , b , c]

  }

  })

  Vm.items[1]=x //没有响应

  Vm.items.length=2 //没有响应

  

解决方法

  手动添加监控

  //Vue.set

  Vue.set(vm.items,indexOfItem,newValue)

  vm。$set(vm.items,indexOfItem,newValue)

  使用array的variant方法,因为vue实现了对array的variant方法的响应。

  //Array.prototype.splice

  vm.items.splice(indexOfItem,1,newValue)

  

为什么Vue2.0中监听不到两种数组的变化?

  在官方文档中,这两点被简单总结为“由于JavaScript的限制”,无法实现,而Object.defineProperty是实现数据变化检测的方案。这个限制是指Object.defineProperty吗?

  其实原因不是因为Object.defineProperty()的漏洞,而是性能问题。数组中Object.defineProperty的表达式与对象中的表达式一致,数组的索引可以视为对象中的键。

  当索引访问或设置相应元素的值时,可以触发Getter和setter方法。

  按下或取消移动将增加索引,新添加的属性需要手动初始化才能被观察到。

  通过pop或shift删除元素将删除和更新索引,并触发setter和getter方法。

  所以Object.defineProperty有监控数组下标变化的能力,但是vue2.x放弃了这个特性。

  

源码分析

  Object.property可以检测按索引改变数组的操作,但是Vue不实现。那我们来看看源代码:

  

Vue3.0

  在Vue3.0中,使用proxy代替Object.defineProperty()来解决其存在的问题。

  以上就是Vue2中无法检测到数组变化的原因以及解决方案的细节。更多关于Vue2中数组变化的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: