Vue數(shù)據(jù)更新視圖未更新的幾種解決方案
一、問題描述
在Vue項(xiàng)目中,有時(shí)我們會(huì)遇到數(shù)據(jù)更新了,但是視圖沒有更新的情況,這是因?yàn)閂ue使用的是異步更新的方式,如果數(shù)據(jù)變化時(shí)視圖沒有立即響應(yīng),則一般都會(huì)考慮使用以下幾種解決方案:
- 方案一:使用
watch監(jiān)聽對(duì)象屬性變化
<template>
<div>
<h3>{{userInfo.name}}</h3>
<button @click="changeUserName">點(diǎn)擊我改變用戶名</button>
</div>
</template>
<script>
export default {
data(){
return {
userInfo: {
name: '張三',
age: 16
}
}
},
watch:{
'userInfo.name': {
handler(newValue, oldValue) {
console.log('用戶名變化了,新值:' + newValue + ',舊值:' + oldValue);
},
immediate: true,
deep: true
}
},
methods:{
changeUserName(){
// 假設(shè)異步請(qǐng)求修改用戶名
const newUserName = '李四';
this.userInfo.name = newUserName;
}
}
}
</script>
- 方案二:使用
this.$set()強(qiáng)制更新響應(yīng)式變量
// 定義數(shù)據(jù)對(duì)象:
obj: { name: "小明", age: 18, },
// 基本語(yǔ)法:
this.$set(需要改變的對(duì)象,"需要改變的對(duì)象屬性","新值")
示例如下:
<template>
<div>
<h3>{{initList.message}}</h3>
<button @click="changeMessage">點(diǎn)擊我改變message值</button>
</div>
</template>
<script>
export default {
data(){
return {
initList: {
message: 'hello'
},
}
},
methods:{
changeMessage(){
// 假設(shè)是異步調(diào)用獲取到了新的message值
const newMessage='world';
this.$set(this.initList, 'message', newMessage);
}
}
}
</script>
- 方案三:使用
this.$forceUpdate()強(qiáng)制性重新渲染
methods: {
// 在某些情況下需要強(qiáng)制重新渲染組件
forceRerender() {
// 調(diào)用 $forceUpdate()方法
this.$forceUpdate();
}
}
但是,在項(xiàng)目中,如果以上方案均無效,比如由于無法使用watch或this.$set()實(shí)現(xiàn)所需功能,或者使用后會(huì)使代碼變得更復(fù)雜、冗余;同時(shí)層級(jí)太多或其他原因?qū)е?code>this.$forceUpdate()也不起作用,那么還有什么方案可以解決視圖不更新的問題呢?
二、解決方案
為確保視圖更新,可以先將數(shù)據(jù)賦值后再清空,最后在this.$nextTick()中處理數(shù)據(jù),并重新賦值。代碼示例如下:
// 為確保視圖更新,先將數(shù)據(jù)重新賦值給一個(gè)變量,然后再清空
const details = this.detailsList;
this.detailsList = [];
// 處理數(shù)據(jù),并重新賦值
this.$nextTick(() => {
// 處理數(shù)據(jù)
const detailsList = this.formatList(details, data.playCourseChapterId);
// 重新賦值
this.detailsList = Object.assign([], detailsList);
})
這時(shí),數(shù)據(jù)更新的同時(shí),視圖也會(huì)同步更新。
備注:
我這邊的項(xiàng)目中,是因?yàn)閷蛹?jí)循環(huán)太多,導(dǎo)致以上三種方案均不起作用。只有最后這種方案可以解決視圖不更新的問題。
以上,希望對(duì)大家有幫助!
到此這篇關(guān)于Vue數(shù)據(jù)更新視圖未更新的幾種解決方案的文章就介紹到這了,更多相關(guān)Vue數(shù)據(jù)更新視圖未更新內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue?項(xiàng)目?jī)?yōu)雅的對(duì)url參數(shù)加密詳解
這篇文章主要為大家介紹了vue?項(xiàng)目?jī)?yōu)雅的對(duì)url參數(shù)加密詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
vue3 canvas選擇器Canvas增加頁(yè)面性能方式
本文介紹了使用Vue3CompositionAPI和Canvas實(shí)現(xiàn)的交互式選擇器組件,支持PC端和移動(dòng)端的拖動(dòng)選擇、多選和取消選擇功能2026-05-05
Vue實(shí)現(xiàn)天氣預(yù)報(bào)小應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)天氣預(yù)報(bào)小應(yīng)用,查詢一些城市的天氣情況,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Vue中動(dòng)態(tài)設(shè)置img的src值實(shí)現(xiàn)方式
在Vue中動(dòng)態(tài)綁定img的src屬性時(shí),需使用v-bind或:語(yǔ)法,確保數(shù)據(jù)為有效字符串或URL格式,避免編譯錯(cuò)誤,開發(fā)環(huán)境通過顏色區(qū)分錯(cuò)誤類型,有助于快速定位問題2025-09-09
Vue中自動(dòng)生成路由配置文件覆蓋路由配置的思路詳解
這篇文章主要介紹了Vue中自動(dòng)生成路由配置文件覆蓋路由配置的思路詳解,大概思路是讀取@/views下所有index.vue如果當(dāng)前文件下有包含相同路徑則認(rèn)為是它的子路由,需要的朋友可以參考下2024-05-05
Vue項(xiàng)目history模式下微信分享爬坑總結(jié)
這篇文章主要介紹了Vue項(xiàng)目history模式下微信分享爬坑總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
vue中{{}},v-text和v-html區(qū)別與應(yīng)用詳解
這篇文章主要介紹了vue中{{}},v-text和v-html區(qū)別與應(yīng)用詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
解決找不到模塊“xxx.vue”或其相應(yīng)的類型聲明問題
這篇文章主要介紹了解決找不到模塊“xxx.vue”或其相應(yīng)的類型聲明問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-10-10
Vue+Element一步步實(shí)現(xiàn)動(dòng)態(tài)添加Input_輸入框案例
這篇文章主要介紹了Vue+Element一步步實(shí)現(xiàn)動(dòng)態(tài)添加Input_輸入框案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09

