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, }, // 基本語法: 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 組件參數(shù)校驗(yàn)與非props特性的方法
這篇文章主要介紹了Vue 組件參數(shù)校驗(yàn)與非props特性的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02Vue項(xiàng)目打包優(yōu)化實(shí)踐指南(推薦!)
如果引入的庫眾多,那么vendor.js文件體積將會(huì)相當(dāng)?shù)拇?影響首開的體驗(yàn),這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目打包優(yōu)化實(shí)踐的相關(guān)資料,需要的朋友可以參考下2022-06-06VueCli生產(chǎn)環(huán)境打包部署跨域失敗的解決
這篇文章主要介紹了VueCli生產(chǎn)環(huán)境打包部署跨域失敗的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11vue實(shí)現(xiàn)頁面加載動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)頁面加載動(dòng)畫效果,vue頁面出現(xiàn)正在加載的初始頁面與實(shí)現(xiàn)動(dòng)畫效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09vue連接本地服務(wù)器的實(shí)現(xiàn)示例
本文主要介紹了vue連接本地服務(wù)器的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01