Vue视图不更新问题初探
Posted 前端打字员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue视图不更新问题初探相关的知识,希望对你有一定的参考价值。

let vm = new Vue({
data() {
return {
a: 0,
};
},
});
// vm.a 是响应式的
vm.b = 1;
// vm.b 是非响应的
let vm = new Vue({
data() {
return {
author: {
name: 'Apisit Lee',
},
};
},
});
Vue.set(vm.author, 'gender', 'male');
// vm.author.gender 是响应式的!
this.$set(vm.author, 'gender', 'male');
// 这种方式不触发更新
Object.assign(this.author, {age: 26});
// 这种方式会触发更新
this.author = Object.assign({}, this.author, {age: 26});
由于JavaScript限制,Vue无法监听以下两类数组变化:
通过索引直接改变数组项,例如:this.arrObject[itemIndex] = newVal;
修改数组的长度,例如:this.arrObject.length = newLength;
对于第一类问题,可以通过Vue提供的set方法(或$set实例方法)或者数组的splice方法来解决,比如:
Vue.set(this.arrObject, itemIndex, newVal);
// 或者
this.$set(this.arrObject, itemIndex, newVal);
// 或者
this.arrObject.splice(itemIndex, 1, newVal);
对于第二类问题,可以用数组的splice方法解决,比如:
this.arrObject.splice(newLength);
Vue在更新DOM的时候是异步执行的。当Vue侦听到数据变化后,不是立即更新视图,而是开启一个队列,将同一事件循环中的所有数据变化都缓存在队列中。然后在下一事件循环中更新DOM。由于这种更新机制,在同一事件循环中,数据的频繁变化并不会引起视图的频繁变更,这一点对于避免不必要的计算与渲染是很重要的。
一般我们在使用Vue时,其“数据驱动”的思想可以让我们减少对DOM的直接操作,更专注于计算逻辑。但是,有时我们后续的操作依赖于DOM更新后的状态,这种情况下,单纯的数据驱动是很难满足需求的。所以,Vue又提供了一个方法Vue.nextTick(callback)用于即时获取到DOM更新后的状态。
<div id="example">{{message}}</div>
const vm = new Vue({
el: '#example',
data: {
message: '123'
}
});
vm.message = 'new message'; // 更改数据
vm.$el.textContent === 'new message'; // false
Vue.nextTick(function () {
vm.$el.textContent === 'new message'; // true
});
methods: {
updateMessage: async function () {
this.message = '已更新'
console.log(this.$el.textContent) // => '未更新'
await this.$nextTick()
console.log(this.$el.textContent) // => '已更新'
}
}

以上是关于Vue视图不更新问题初探的主要内容,如果未能解决你的问题,请参考以下文章
vue中detele删除对象属性时视图不能响应更新 - 解决办法