在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ vue keepalive,緩存

vue keepalive,緩存

路由配置:

{
    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?

不好猜?。?!

2018年5月1日 09:46
編輯回答
薄荷糖

按照我們團(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)景,既要它不變,又想它變,就矛盾了。

2017年3月29日 02:28
編輯回答
莫小染

自己解決了,比較丑陋,體驗(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();
        },
2018年4月15日 05:34