路由配置:
{
path: '/submit',
component: resolve => {
require(['./pages/sb.vue'], resolve);
},
meta: {keepAlive: true}
},
app.vue配置
<!-- 這里是需要keepalive的 -->
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<!-- 這里不會(huì)被keepalive -->
<router-view v-if="!$route.meta.keepAlive"></router-view>
(因?yàn)槲业拇a比較長(zhǎng),復(fù)制了下別人的,基本情況是一樣的)
現(xiàn)在有這樣一個(gè)情形:
list_1和list_2是由同一個(gè)vue頁(yè)面渲染出來(lái)的兩個(gè)路由頁(yè)面;detail_1是list_1的詳情頁(yè);
需要判斷或者選擇緩存的是list_1和list_2頁(yè)面,詳情頁(yè)不進(jìn)行緩存;
list_1--detail_1;
list_2--detail_2;
情形1:從list_1跳轉(zhuǎn)到detail_1,緩存list_1頁(yè)面;瀏覽器返回list_1,調(diào)用緩存;正常。
情形2:從list_1跳轉(zhuǎn)到detail_1,緩存list_1頁(yè)面;點(diǎn)擊list_2,緩存list_2頁(yè)面;再點(diǎn)擊detail_2,瀏覽器返回list_2;此時(shí)頁(yè)面顯示的是list_1的數(shù)據(jù),不正常。
情形2怎么處理?緩存了兩個(gè)頁(yè)面,無(wú)法選擇或銷(xiāo)毀想要的緩存頁(yè)面。
從l2進(jìn)入d2,然后又回到列表頁(yè),顯示的是l1,說(shuō)明緩存沒(méi)有成功,能把你列表頁(yè)的代碼貼出來(lái)看一下嗎
另外,你一個(gè)組件加載不同的列表類(lèi)型,是根據(jù)路由傳參判斷的類(lèi)型嗎,是不是返回列表頁(yè)的時(shí)候參數(shù)沒(méi)傳過(guò)去,導(dǎo)致加載的是默認(rèn)的列表頁(yè)1?
又或者你是在一個(gè)頁(yè)面加載了兩個(gè)列表組件,只是用if或者show控制了他們的顯示隱藏,從詳情頁(yè)回來(lái)的時(shí)候,該頁(yè)面控制顯示隱藏的變量重置了,所以顯示的是默認(rèn)的列表1?
不好猜?。?!
按照我們團(tuán)隊(duì)的規(guī)范,list 列表頁(yè)會(huì)進(jìn)行 keep-alive 保持,詳情頁(yè)會(huì)在離開(kāi)的時(shí)候直接 destroy,避免你提到的連續(xù)點(diǎn)開(kāi)詳情頁(yè)的問(wèn)題。因?yàn)橐粋€(gè)component 只會(huì)初始化一次,在不銷(xiāo)毀新建的情況下,可能無(wú)法觸發(fā)數(shù)據(jù)的重新獲取,進(jìn)而展示上一次打開(kāi)的detail_1,keep-alive 是直接休眠在喚醒。另外,針對(duì)數(shù)據(jù)可變的頁(yè)面去做 keep-alive 也不太符合它的應(yīng)用場(chǎng)景,既要它不變,又想它變,就矛盾了。
自己解決了,比較丑陋,體驗(yàn)不是很好。不過(guò)需求實(shí)現(xiàn)了。通過(guò)刷新list頁(yè)面來(lái)清除不需要的緩存。
路由:
列表:
{
path: '/list_1',
name: 'list_1',
component: resolve => require(['pages/list'], resolve),
meta: {
title: "列表1",
keepAlive: true,
isBack: false, //用于判斷上一個(gè)頁(yè)面是哪個(gè)
lastRoute: '',
}
}, {
path: '/list_2',
name: 'list_2',
component: resolve => require(['pages/list'], resolve),
meta: {
title: "列表2",
keepAlive: true,
isBack: false, //用于判斷上一個(gè)頁(yè)面是哪個(gè)
lastRoute: '',
}
},
詳情:
{
path: '/detail/:id',
name: 'detail',
component: resolve => require(['pages/detail'], resolve),
meta: {
title: "詳情頁(yè)",
keepAlive: false,
isBack: true, //用于判斷上一個(gè)頁(yè)面是哪個(gè)
lastRoute: '',
}
},
列表頁(yè)主要代碼:
watch: {
'$route' (to, from) {
//通過(guò)lastRoute來(lái)判斷上一個(gè)頁(yè)面是哪一個(gè)list頁(yè),通過(guò)isBack判斷上一個(gè)頁(yè)面是否是詳情頁(yè)
if (from.meta.lastRoute !== to.name && from.meta.lastRoute && to.meta.isBack === false) {
this.$router.push({name:'reload'})
}
}
},
beforeRouteLeave(to, from, next) {
//手動(dòng)設(shè)置當(dāng)前頁(yè)的keepAlive=true
from.meta.keepAlive = true
//若果去的是列表頁(yè)(isBack=false),銷(xiāo)毀緩存
if (to.meta.isBack === false){
this.$destroy() //無(wú)法在beforeRouteEnter中使用
}
//在下一個(gè)頁(yè)面的meta中設(shè)置lastRoute,以便在下一個(gè)頁(yè)面中判斷上一個(gè)頁(yè)面的名字
to.meta.lastRoute = this.$route.name
next();
},
詳情頁(yè)代碼:
beforeRouteLeave(to, from, next) {
//在詳情頁(yè)判斷上一個(gè)頁(yè)面和下一個(gè)頁(yè)面是否一致,一致則使用緩存,不一致則不使用緩存;
//通過(guò)設(shè)置下一個(gè)頁(yè)面(列表頁(yè))的keepAlive來(lái)確定是否使用;
//因?yàn)榱斜眄?yè)始終需要進(jìn)行緩存,在這里(詳情頁(yè))設(shè)置了他的keepAlive=false,所以需要在列表頁(yè)重新設(shè)置keepAlive=rue
if (from.meta.lastRoute !== to.name ){
//若去的頁(yè)面和來(lái)的頁(yè)面不一致,銷(xiāo)毀已經(jīng)存在的list緩存
to.meta.keepAlive = false;
}
next();
},北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。