vue移動(dòng)端項(xiàng)目緩存問(wèn)題實(shí)踐記錄
最近在做一個(gè)vue移動(dòng)端項(xiàng)目,被緩存問(wèn)題搞得頭都大了,積累了一些經(jīng)驗(yàn),特此記錄總結(jié)下,權(quán)當(dāng)是最近項(xiàng)目問(wèn)題的一個(gè)回顧吧!
先描述下問(wèn)題場(chǎng)景:A頁(yè)面->B頁(yè)面->C頁(yè)面。假設(shè)A頁(yè)面是列表頁(yè)面,B頁(yè)面是列表詳情頁(yè)面,C頁(yè)面是操作改變B頁(yè)面的一些東西,進(jìn)行提交類似的操作。A頁(yè)面進(jìn)入B頁(yè)面,應(yīng)該根據(jù)不同的列表item顯示不一樣的詳情,從B進(jìn)入C,也應(yīng)該根據(jù)item的標(biāo)識(shí)比如ID展示不一樣的內(nèi)容,在C頁(yè)面操作后,返回B頁(yè)面,B頁(yè)面數(shù)據(jù)發(fā)生變化。這個(gè)時(shí)候會(huì)有兩種情況:
- C頁(yè)面操作數(shù)據(jù)后返回B頁(yè)面,B頁(yè)面對(duì)應(yīng)數(shù)據(jù)應(yīng)該發(fā)生變化。
- C頁(yè)面直接點(diǎn)擊左上角箭頭返回,B頁(yè)面對(duì)應(yīng)數(shù)據(jù)不應(yīng)該發(fā)生變化。繼續(xù)返回A列表頁(yè)面,換一條數(shù)據(jù),繼續(xù)進(jìn)入B頁(yè)面,B頁(yè)面展示不同內(nèi)容,進(jìn)入C頁(yè)面,C頁(yè)面刷新展示不同內(nèi)容
另一種情況發(fā)生在寫郵件的頁(yè)面中,添加收件人,選人之后,繼續(xù)添加,之前添加的聯(lián)系人應(yīng)該存在。但是從寫郵件頁(yè)面返回郵件列表再次進(jìn)入寫郵件頁(yè)面,之前添加過(guò)的聯(lián)系人數(shù)據(jù)就不應(yīng)該存在了,這里就涉及到如何處理緩存,何時(shí)使用緩存,何時(shí)清除緩存的問(wèn)題了。
目前項(xiàng)目整體結(jié)構(gòu)如下:
<template> <div id="app"> <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"></router-view> </div> </template>
雖然官方提供了include,exclude,可以讓我們決定哪些組件使用緩存,哪些不使用緩存,但是并沒(méi)有解決我們想動(dòng)態(tài)使用緩存的目的,目前我的項(xiàng)目使用了如下兩種方式處理緩存:
方式一 ,使用是否使用緩存標(biāo)識(shí)
在路由文件router.js里給每個(gè)路由添加meta信息,標(biāo)識(shí)是否使用緩存。
meta: {
isUseCache: false,//不使用緩存
keepAlive: true
}
使用方式:
A->B,B不能緩存;B->A,A緩存。
(1)A頁(yè)面:
beforeRouteLeave(to, from, next) {
// 設(shè)置下一個(gè)路由的 meta
if(to.path=='/B'){
to.meta.isUseCache = false;
}
next();
},
activated(){
if(!this.$route.meta.isUseCache){
this.getData();
}
}
(2) B頁(yè)面
beforeRouteLeave(to, from, next) {
// 設(shè)置下一個(gè)路由的 meta
if(to.path=='/A'){
to.meta.isUseCache = true;
}
next();
},
activated(){
if(!this.$route.meta.isUseCache){
this.getData();
}
}
方式二,強(qiáng)制清除緩存。
這種方式是從網(wǎng)上找的一種方式,使用了vue內(nèi)部組件之后,不在支持動(dòng)態(tài)銷毀組件,緩存一直存在,只能從源頭上下手,清掉緩存。
export const removeCatch = {
beforeRouteLeave:function(to, from, next){
if (from && from.meta.rank && to.meta.rank && from.meta.rank>to.meta.rank)
{//此處判斷是如果返回上一層,你可以根據(jù)自己的業(yè)務(wù)更改此處的判斷邏輯,酌情決定是否摧毀本層緩存。
if (this.$vnode && this.$vnode.data.keepAlive)
{
if (this.$vnode.parent && this.$vnode.parent.componentInstance && this.$vnode.parent.componentInstance.cache)
{
if (this.$vnode.componentOptions)
{
var key = this.$vnode.key == null
? this.$vnode.componentOptions.Ctor.cid + (this.$vnode.componentOptions.tag ? `::${this.$vnode.componentOptions.tag}` : '')
: this.$vnode.key;
var cache = this.$vnode.parent.componentInstance.cache;
var keys = this.$vnode.parent.componentInstance.keys;
if (cache[key])
{
if (keys.length) {
var index = keys.indexOf(key);
if (index > -1) {
keys.splice(index, 1);
}
}
delete cache[key];
}
}
}
}
this.$destroy();
}
next();
}
};
在需要清掉緩存的頁(yè)面混合引入該js即可。
總結(jié)
以上所述是小編給大家介紹的vue移動(dòng)端項(xiàng)目緩存問(wèn)題實(shí)踐記錄,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Vue3如何理解ref toRef和toRefs的區(qū)別
本文主要介紹了Vue3如何理解ref toRef和toRefs的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
vue 實(shí)現(xiàn)邊輸入邊搜索功能的實(shí)例講解
今天小編就為大家分享一篇vue 實(shí)現(xiàn)邊輸入邊搜索功能的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue中的.$mount(''#app'')手動(dòng)掛載操作
這篇文章主要介紹了vue中.$mount('#app')手動(dòng)掛載操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
vue.js動(dòng)態(tài)設(shè)置VueComponent高度遇到的問(wèn)題及解決
這篇文章主要介紹了vue.js動(dòng)態(tài)設(shè)置VueComponent高度遇到的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
基于Vue實(shí)現(xiàn)簡(jiǎn)單的貪食蛇游戲
貪食蛇是一個(gè)非常經(jīng)典的游戲,?在游戲中,?玩家操控一條細(xì)長(zhǎng)的直線,?它會(huì)不停前進(jìn),?玩家只能操控蛇的頭部朝向,?一路拾起觸碰到之物。本文將用Vue實(shí)現(xiàn)這一游戲,感興趣的可以嘗試一下2022-04-04

