vue监听不到数组对象的变化

3 篇文章 0 订阅
1 篇文章 0 订阅

对于普通的js对象


 - Vue 将遍历此对象所有的 property,
 - 并使用 Object.defineProperty 把这些 property 全部转为getter/setter, 
 - 使得vue可以在内部对这些数据进行追踪依赖, 在property被访问和修改时通知变更,重新渲染相关联的组件。

关于对象

Vue 不允许动态添加根级别的响应式 property。但是我们可以利用vue的内置方法,

 - 使用Vue.set(object, propertyName, value)方法
 - 该方法向嵌套对象添加响应式property,此时vue可以监听到对象的变化。

// 非响应式-直接通过对象的属性名赋值
this.obj.prop1 = '1'  // 增
delete this.obj.prop2  // 删
this.obj.prop3 = '3'  // 改

 // 响应式设置 
Vue.set(vm.obj, 'prop1', 2)  // Vue.set(obj, key ,value) 
this.$set(this.obj,'prop1',2) // this.$set(obj, key ,value) 
this.obj = {name: 'test'} // 直接赋值

关于数组

Vue 不能检测以下数组的变动,因为这些都是不是响应式的。

 - 如利用索引直接设置一个数组项,即使用下标修改某个元素(vm.arr[indexOfItem] = newValue)
 - 直接修改数组的长度(vm.arr.length = newLength) 
// 响应式设置-解决方案
Vue.set(vm.items, indexOfItem, newValue)
this.$set(vm.items, indexOfItem, newValue)

vm.items.splice(indexOfItem, 1, newValue)
vm.items.splice(newLength)
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js 是一款流行的前端框架,它提供了一种数据绑定的机制,可以实时监测数据的变化并更新页面。在 Vue3 中,为了实现更高效的数据监听,引入了 Proxy 代理对象来替代 Vue2 中的 Object.defineProperty。 然而,有时候在使用 Vue3 时,我们会遇到数组监听失效的情况。这可能是由于一些常见的原因导致的。 首先,Vue3 中的数组监听是通过 Proxy 对象实现的,而不是对数组的原型进行改写。这种改变带来了性能上的提升,但也可能导致一些细微的问题。比如,如果直接修改数组的索引或长度,而不是使用 Vue 提供的数组方法(如 push、pop 等),则监听可能会失效。 其次,由于 Vue3 使用 Proxy 对象进行监听,Proxy 对象只能监听对象的直接属性,而不能监听数组的索引。也就是说,如果直接修改数组的索引监听将不会触发。为了解决这个问题,我们需要使用特定的方法来修改数组,以确保监听正常工作。 最后,如果在数组中进行的操作过于频繁,可能会导致监听失效。频繁的更新操作可能会影响性能,甚至导致监听器无法及时捕捉到变化。这时我们可以考虑使用延迟处理或其他优化方法来避免这个问题。 综上所述,Vue3 数组监听有时候失效可能是由于直接修改数组的索引、长度或频繁的更新操作造成的。为了避免这个问题,我们应该正确使用 Vue 提供的数组方法来修改数组,并对频繁的更新操作进行优化,以确保监听器能够正常工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值