Vue 检测不到数组和对象的变化的解决方法

1,900 阅读1分钟

问题:当我们对数组进行简单的更改的时候,发现可以在用console打印在控制台,但是并不能在页面改变其值。

 let arr= ['改变','不改变']
 arr[1] = '我想被改变'
 console.log(arr[1])   //可以看到控制台上被改变,但是页面上并没有更新

原因:由于 JavaScript 的限制,Vue 不能检测数组和对象的变化。

关于数组的部分:

其中对于数组,vue不能检测的改变有:

  • 通过数组的索引值进行改变某一项,像刚刚的例子。
  • 不能直接对数组长度的属性进行修改,例如:arr.length = 4

对此,vue提供了两种方法让我们来解决此问题: 第一种:使用全局set方法

Vue.set(vm.items, indexOfItem, newValue)
//Vue.set(数组名字, 改变的索引位置, 需要更改的值)
// Vue.set(arr,1,'我想被改变')

第二种:使用vue实例上的$set方法

vm.$set(vm.items, indexOfItem, newValue)
//vm.$set(数组名字, 改变的索引位置, 需要更改的值)
//this.$set(arr,1,'我想要不要被改变')

关于对象的部分:

对于已经创建的实例对象,依然是可以通过以下两种方法进行更改。

  • 方法一:Vue.set(vm.someObject, 'b', 2)
  • 方法二:this.$set(this.someObject,'b',2)