- 由于 JavaScript 的限制,Vue 不能检测以下变动的数组:
- 当利用索引直接设置一个项时,例如:
this.items[index] = value; - 当修改数组的长度时,例如:
vm.items.length = newLength。
- 当利用索引直接设置一个项时,例如:
- 由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除。
举例来看,就是:
// 数组export default {data () {return {items: ['a', 'b', 'c']}},methods: {handler () {this.items[1] = 'x'; // 不是响应性的}}}
使用 $set:
// 数组export default {data () {return {items: ['a', 'b', 'c']}},methods: {handler () {this.$set(this.items, 1, 'x'); // 是响应性的}}}
以对象为例:
// 对象export default {data () {return {item: {a: 1}}},methods: {handler () {this.item.b = 2; // 不是响应性的}}}
使用 $set:
// 对象export default {data () {return {item: {a: 1}}},methods: {handler () {this.$set(this.item, 'b', 2); // 是响应性的}}}
另外,数组的以下方法,都是可以触发视图更新的,也就是响应性的:
push()、pop()、shift()、unshift()、splice()、sort()、reverse()。
还有一种小技巧,就是先 copy 一个数组,然后通过 index 修改后,再把原数组整个替换,比如:
handler () {const data = [...this.items];data[1] = 'x';this.items = data;}
