關(guān)于v-if和v-for連用出現(xiàn)的問(wèn)題

業(yè)務(wù)場(chǎng)景:

根據(jù)后臺(tái)返回的圖片list在頁(yè)面顯示,頁(yè)面中需要v-for循環(huán)出圖片并且判斷l(xiāng)ist是否為空,為空的話還需要v-else做一個(gè)為空的展示效果。從而出現(xiàn)了v-if和v-for連用的場(chǎng)景。
在vue實(shí)際開(kāi)發(fā)中,我們避免不了會(huì)使用v-for和v-if來(lái)操作數(shù)據(jù),但是v-for和v-if同時(shí)使用時(shí),有一個(gè)先后運(yùn)行的優(yōu)先級(jí),v-for比v-if的優(yōu)先級(jí)更高,這就說(shuō)明在v-for的每次循環(huán)運(yùn)行中每一次都會(huì)調(diào)用v-if的判斷,所以不推薦v-if和v-for在同一個(gè)標(biāo)簽內(nèi)同時(shí)使用,連用代碼也會(huì)報(bào)錯(cuò)。

問(wèn)題實(shí)質(zhì):

問(wèn)題的實(shí)質(zhì)是因?yàn)樵趘ue中會(huì)優(yōu)先執(zhí)行v-for, 當(dāng)v-for把所有內(nèi)容全部遍歷之后 , v-if再對(duì)已經(jīng)遍歷的元素進(jìn)行刪除 , 造成了加載的浪費(fèi) , 所以應(yīng)該在執(zhí)行v-for之前優(yōu)先執(zhí)行v-if , 可以減少加載的壓力

解決辦法:

1.當(dāng)控制v-if的元素不存在v-for中 , 可以使用template包裹住對(duì)應(yīng)的v-for , 也可以使用父級(jí)元素添加v-if , 可以不加載從而優(yōu)化性能

添加一個(gè)template

<div>
    <template v-if="showActive">
        <div v-for"item in list" :key="item.id">{{item.value}}</div>
    </template>
    <div class="bottom"/>
</div>

添加到父級(jí)

<ul v-if="showActive">
   <li v-for="item in list" :key="item.id">{{item.value}}</li>
</ul>

2.可以使用過(guò)濾器將v-if中的判斷轉(zhuǎn)移到vue的computed的計(jì)算屬性中

computed: {
    loadList() {
       const { list } = this
       return list.filter(item => item.value)
    }
}
//或者
<ul>
    <li v-for="(item,id) in formList" :key="id"></li>
</ul>
 
//利用vue的計(jì)算屬性,過(guò)濾掉不需要的數(shù)據(jù),剩下需要的數(shù)據(jù)再利用v-for循環(huán)遍歷取出渲染
computed: {
    formList: function () {
        return this.list.filter(function (item) {
            return item.state
        })
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容