1. 由于 JavaScript 的限制,Vue 不能检测以下变动的数组:
      1. 当利用索引直接设置一个项时,例如:this.items[index] = value;
      2. 当修改数组的长度时,例如:vm.items.length = newLength
    2. 由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除

    举例来看,就是:

    1. // 数组
    2. export default {
    3. data () {
    4. return {
    5. items: ['a', 'b', 'c']
    6. }
    7. },
    8. methods: {
    9. handler () {
    10. this.items[1] = 'x'; // 不是响应性的
    11. }
    12. }
    13. }

    使用 $set

    1. // 数组
    2. export default {
    3. data () {
    4. return {
    5. items: ['a', 'b', 'c']
    6. }
    7. },
    8. methods: {
    9. handler () {
    10. this.$set(this.items, 1, 'x'); // 是响应性的
    11. }
    12. }
    13. }

    以对象为例:

    1. // 对象
    2. export default {
    3. data () {
    4. return {
    5. item: {
    6. a: 1
    7. }
    8. }
    9. },
    10. methods: {
    11. handler () {
    12. this.item.b = 2; // 不是响应性的
    13. }
    14. }
    15. }

    使用 $set

    1. // 对象
    2. export default {
    3. data () {
    4. return {
    5. item: {
    6. a: 1
    7. }
    8. }
    9. },
    10. methods: {
    11. handler () {
    12. this.$set(this.item, 'b', 2); // 是响应性的
    13. }
    14. }
    15. }

    另外,数组的以下方法,都是可以触发视图更新的,也就是响应性的:

    push()pop()shift()unshift()splice()sort()reverse()
    还有一种小技巧,就是先 copy 一个数组,然后通过 index 修改后,再把原数组整个替换,比如:

    1. handler () {
    2. const data = [...this.items];
    3. data[1] = 'x';
    4. this.items = data;
    5. }