vue中data数据更新,视图却没有更新的原因

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

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

当利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue
可以使用:

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

由于 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'
})

也可能是因为写的代码比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]);

猜你喜欢

转载自blog.csdn.net/xiaozaq/article/details/107536607
今日推荐