直接给一个数组项赋值,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)做了重写,这些方法可以改变数组