Vue为什么不能检测数组变动,难道不是因为它不追踪数组内部元素的变动吗?

2026-04-06 14:390阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1539个文字,预计阅读时间需要7分钟。

Vue为什么不能检测数组变动,难道不是因为它不追踪数组内部元素的变动吗?

问题来源:https://segmentfault.com/q/1010000015780995问题描述:Vue检测数据变化的原理是通过Object.defineProperty实现的,因此无法监听数组的添加操作。因为这是在构造函数中就已经完成的。

问题来源:segmentfault.com/q/1010000015780995

问题描述:Vue检测数据的变动是通过Object.defineProperty实现的,所以无法监听数组的添加操作是可以理解的,因为是在构造函数中就已经为所有属性做了这个检测绑定操作。

但是官方的原文:由于 JavaScript 的限制, Vue 不能检测以下变动的数组:

当你利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue
当你修改数组的长度时,例如: vm.items.length = newLength

这句话是什么意思?我测试了下Object.defineProperty是可以通过索引属性来设置属性的访问器属性的,那为何做不了监听?

有些论坛上的人说因为数组长度是可变的,即使长度为5,但是未必有索引4,我就想问问这个答案哪里来的,修改length,新增的元素会被添加到最后,它的值为undefined,通过索引一样可以获取他们的值,怎么就叫做“未必有索引4”了呢?

既然知道数组的长度为何不能遍历所有元素并通过索引这个属性全部添加set和get不就可以同时更新视图了吗?

如果非要说的话,考虑到性能的问题,假设元素内容只有4个有意义的值,但是长度确实1000,我们不可能为1000个元素做检测操作。

阅读全文

本文共计1539个文字,预计阅读时间需要7分钟。

Vue为什么不能检测数组变动,难道不是因为它不追踪数组内部元素的变动吗?

问题来源:https://segmentfault.com/q/1010000015780995问题描述:Vue检测数据变化的原理是通过Object.defineProperty实现的,因此无法监听数组的添加操作。因为这是在构造函数中就已经完成的。

问题来源:segmentfault.com/q/1010000015780995

问题描述:Vue检测数据的变动是通过Object.defineProperty实现的,所以无法监听数组的添加操作是可以理解的,因为是在构造函数中就已经为所有属性做了这个检测绑定操作。

但是官方的原文:由于 JavaScript 的限制, Vue 不能检测以下变动的数组:

当你利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue
当你修改数组的长度时,例如: vm.items.length = newLength

这句话是什么意思?我测试了下Object.defineProperty是可以通过索引属性来设置属性的访问器属性的,那为何做不了监听?

有些论坛上的人说因为数组长度是可变的,即使长度为5,但是未必有索引4,我就想问问这个答案哪里来的,修改length,新增的元素会被添加到最后,它的值为undefined,通过索引一样可以获取他们的值,怎么就叫做“未必有索引4”了呢?

既然知道数组的长度为何不能遍历所有元素并通过索引这个属性全部添加set和get不就可以同时更新视图了吗?

如果非要说的话,考虑到性能的问题,假设元素内容只有4个有意义的值,但是长度确实1000,我们不可能为1000个元素做检测操作。

阅读全文