Vue之$set使用

背景

后端参与前端开发的小白,在开发过程当中遇到了以下状况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,若是更新此属性的值,是不会更新视图的。前端

官方文档中是这样描述的:若是在实例建立以后添加新的属性到实例上,它不会触发视图更新。vue

解决方案

官方给出了以下解决方案:react

Vue 不容许在已经建立的实例上动态添加新的根级响应式属性 (root-level reactive property)。然而它能够使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上:后端

Vue.set(vm.obj, 'e', 0)

您还能够使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名:数组

this.$set(this.obj,'e',02)

Vue不能检测数组变更

例以下面两种状况:this

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

举个例子:prototype

var vm = new Vue({
  data: {
    items: ['a', 'b', 'c']
  }
})
vm.items[1] = 'x' // 不是响应性的
vm.items.length = 2 // 不是响应性的

为了解决第一类问题,如下两种方式均可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将触发状态更新:code

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

你也能够使用 vm.$set 实例方法,该方法是全局方法 Vue.set 的一个别名:对象

vm.$set(vm.items, indexOfItem, newValue)

为了解决第二类问题,你能够使用 splice:索引

vm.items.splice(newLength)
相关文章
相关标签/搜索