直接给一个数组项赋值,Vue 能检测到变化吗?

1,669 阅读1分钟

直接给一个数组项赋值,Vue 能检测到变化吗?

由于JavaScript的限制,Vue 不能检测到以下数组的变动:

  • 当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue

为了解决这一个问题,Vue 提供了以下操作方法:

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

// vm.$set,Vue.set的一个别名
vm.$set(vm.items, indexOfItem, newValue)

// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)
  • 当你修改数组的长度时,例如:vm.items.length = newLength

为了解决这一个问题,以下操作方法:

// Array.prototype.splice
vm.items.splice(newLength)

Vue不能检测到以元素赋值方式的数组变动是因为:

  • 动态添加的数组项不能被劫持生成getter, setter,因此无法产生响应。
  • 给数组每一项做劫持,性能低且笨拙

Vue能检测到数组变动的方法:

实际上,Vue对数组项的操作方法(pop, push, shifut, unshift, splice, sort, reverse)做了重写,这些方法可以改变数组