Vue更改了data里的数据,但是视图却没有更新

  1. 由于 JavaScript 的限制,Vue 不能检测以下数组的变动:

    var vm = new Vue({
      data: {
        items: ['a', 'b', 'c']
      }
    })
    vm.items[1] = 'x' // 不是响应性的
    vm.items.length = 2 // 不是响应性的
    
    • 当利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue

      可以使用:

      1. Vue.set(vm.items, indexOfItem, newValue);或者:vm.$set(vm.items, indexOfItem, newValue)
      2. vm.items.splice(indexOfItem, 1, newValue)
    • 当修改数组的长度时,例如:vm.items.length = newLength

      可以使用:vm.items.splice(newLength)

  2. 由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除:

    因为Vue 会在初始化实例时对属性执行 getter/setter 转化,所以属性必须在 data 对象上存在才能让 Vue 将它转换为响应式的。

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

    对于已经创建的实例,Vue 不允许动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性。

    var vm = new Vue({
      data: {
        userProfile: {
          name: 'Anika'
        }
      }
    })
    
    Vue.set(vm.userProfile, 'age', 27)
    或者:可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名:
    vm.$set(vm.userProfile, 'age', 27)
    

    如果为已有对象赋值多个新属性:

    vm.userProfile = Object.assign({}, vm.userProfile, {
      age: 27,
      favoriteColor: 'Vue Green'
    })
    
  3. 也可能是因为写的代码比dom更新执行得快,可以使用this.$nextTick()将代码延迟到下次dom更新之后执行。

    跟全局方法 Vue.nextTick() 一样,不同的是回调的 this 自动绑定到调用它的实例上。

    this.value = '你好啊';
    this.$nextTick(() => {
          console.log(this.$refs['hello'].innerText);
    });
    

修改数组中对象的值:

//data中list的值
list: [
	{
		name:'Lee',
		age:20
	}
]

//响应式修改值
this.list[0].name = "Joh";
this.$set(this.list,0,this.list[0]);

你可能感兴趣的:(Vue)