Vue2.x 响应式的缺点

202 阅读1分钟

Vue2.x 响应式的缺点

先看一下我们怎么样写才算是响应式属性:

var vm = new Vue({  
  data:{  
    a:1  
  }  
})  
  
// `vm.a` 是响应式的
=======================================
vm.b = 2  
// `vm.b` 是非响应式的

vm.b = 2 ,如果我们这样添加的属性,哪怕以后b的值发生了改变,页面也不会更新

因此Vue2.x 也给我们提供了对应的API来解决这个问题

Vue.set(vm.someObject, 'b', 2)

this.$set(this.someObject,'b',2)

还有一种情况是关于数组的

如果你有以下操作,vue则无法检测数组的变化,也就是无法做到响应式:

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

实际例子:

var vm = new Vue({  
  data: {  
    items: ['a', 'b', 'c']  
  }  
})  

vm.items[1] = 'x' // 不是响应性的  
vm.items.length = 2 // 不是响应性的

为了解决vm.items[indexOfItem] = newValue, 可以使用以下的方法

// Vue.set  
Vue.set(vm.items, indexOfItem, newValue)
======================
// Array.prototype.splice  
vm.items.splice(indexOfItem, 1, newValue)

// 或者
vm.$set(vm.items, indexOfItem, newValue)

为了解决vm.items.length = newLength

vm.items.splice(newLength)

说到此,再顺便说一下,除了以下的数组API能做到响应式,其它都不可以

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()