keep-alive緩存篇(進(jìn)階篇)

完整項(xiàng)目地址:vue3-element-plus

體驗(yàn)地址:http://8.135.1.141/vue3-admin-plus

系列文章入口:

前言

當(dāng)我們?cè)谀承┨囟▓鼍爸行枰彺婺硞€(gè)頁面屯伞,此時(shí)就需要用到我們所需要講的keep-alive菠红,本篇主要講解架構(gòu)中keep-alive的原理和使用

keep-alive體驗(yàn)地址

架構(gòu)keep-alive核心源碼分析

src/layout/components/AppMain.vue

<transition v-if="settings.mainNeedAnimation" mode="out-in" name="fade-transform">
  <!-通過keep-alive的include屬性,根據(jù)組件的name進(jìn)行緩存块差,如KeepAlive ->
  <keep-alive :include="cachedViews">
    <component :is="Component" :key="key" />
  </keep-alive>
</transition>

<script>
//通過vuex里的cachedViews控制需要緩存的頁面
//cachedViews: Array<string>  
const cachedViews = computed(() => {
  return store.state.app.cachedViews
})

// cachePage: true  ->頁面初始化后緩存本頁面
// leaveRmCachePage: true -> 頁面離開后或者關(guān)閉后, 移除本頁面緩存 
// leaveRmCachePage和cachePage來自于router里的配置倔丈,請(qǐng)看下面介紹
let oldRoute = null
//代碼原理:通過計(jì)算屬性監(jiān)聽憨闰,當(dāng)router.path變化是觸發(fā)get函數(shù)調(diào)用。從而獲取當(dāng)前路由需五,根據(jù)路由配置信息里的cachePage和leaveRmCachePage決定是否需要緩存和移除緩存
const key = computed({
  get() {
    //頁面離開時(shí)鹉动,如果有cachePage=true和leaveRmCachePage=true,則移除緩存
    if (oldRoute?.name) {
      if (oldRoute.meta?.leaveRmCachePage && oldRoute.meta?.cachePage) {
        store.commit('app/M_DEL_CACHED_VIEW', oldRoute.name)
      }
    }
    //頁面進(jìn)入時(shí)如果有cachePage=true宏邮,則設(shè)置緩存
    if (route.name) {
      if (route.meta?.cachePage) {
        store.commit('app/M_ADD_CACHED_VIEW', route.name)
      }
    }
    //保存上一個(gè)路由信息(也就是當(dāng)前頁面的路由信息)
    oldRoute = JSON.parse(JSON.stringify({ name: route.name, meta: route.meta }))
    return route.path
  }
})
</script>

如何使用

src/router/index.js

     {
        path: 'keep-alive',
        component: () => import('@/views/example/keep-alive'),
        name: 'KeepAlive',
        //如果配置了cachePage: true 則當(dāng)前頁面進(jìn)入后泽示,進(jìn)行緩存。 默認(rèn)是false
        //若果配置了leaveRmCachePage:true 則當(dāng)前頁離開后蜀铲,頁面會(huì)被移除緩存边琉。默認(rèn)是false
        meta: { title: 'Keep-Alive', cachePage: true, leaveRmCachePage: false }
      },
      {
        path: 'router-demo-f',
        name: 'routerDemoF',
        hidden: true,
        component: () => import('@/views/example/keep-alive/RouterDemoF.vue'),
        meta: { title: 'RouterDemo-F', cachePage: true, activeMenu: '/writing-demo/keep-alive' }
      },
      {
        path: 'router-demo-s',
        name: 'routerDemoS',
        hidden: true,
        component: () => import('@/views/example/keep-alive/RouterDemoS.vue'),
        meta: { title: 'RouterDemo-S', cachePage: true, activeMenu: '/writing-demo/keep-alive' }
      }

在meta里設(shè)置cachePage或者leaveRmCachePage,決定是否需要緩存和移除緩存
各種組合情況

cachePage: true, leaveRmCachePage: true  ->頁面進(jìn)入時(shí)緩存记劝,離開時(shí)移除緩存
cachePage: false 或者不寫  ->頁面不緩存变姨,按正常的頁面走
cachePage: true, leaveRmCachePage: false  -> 頁面進(jìn)入時(shí)緩存,離開時(shí)不移除緩存厌丑。那么此頁面緩存會(huì)一直存在定欧,除非手動(dòng)移除

如果進(jìn)行多級(jí)緩存呢

有時(shí)我們會(huì)有這種業(yè)務(wù)場景

1644546522483

從A頁面跳到B頁面在到C頁面,此時(shí)需要A,B,C頁面都需要緩存怒竿。保存A,B,C頁面的狀態(tài)砍鸠,如A頁面的列表搜索條件等。但是如果跳出A,B,C頁面時(shí)需要同時(shí)清空A,B,C頁面的緩存耕驰,如:

1644546982434

實(shí)現(xiàn)原理

1644546489961
核心代碼

src/views/example/keep-alive/KeepAlive.vue

const $route = useRoute()
const $store = useStore()
// cacheGroup為緩存分組  KeepAlive->routerDemoF->routerDemoS
let cacheGroup = ['KeepAlive', 'routerDemoF', 'routerDemoS']
const unWatch = watch(
  () => $route.name,
  () => {
    //如果進(jìn)入的頁面路由name沒有在cacheGroup中爷辱,則清空這個(gè)cacheGroup配置的頁面緩存
    if (!cacheGroup.includes($route.name)) {
      //sleep(300) -> 等進(jìn)入其他頁面后在進(jìn)行頁面緩存清空, 用于頁面性能優(yōu)化
      useCommon()
        .sleep(300)
        .then(() => {
          //遍歷cacheGroup清空頁面緩存
          cacheGroup.forEach((fItem) => $store.commit('app/M_DEL_CACHED_VIEW', fItem))
        })
      //remove watch
      unWatch()
    }
  },
  //deep: true
  //immediate進(jìn)入頁面立即監(jiān)聽
  { immediate: true }
)
注:緩存和tab沒有關(guān)聯(lián),和路由配置有關(guān)聯(lián)

架構(gòu)為什么要這樣設(shè)置呢饭弓?

1.緩存和tab沒有關(guān)聯(lián)双饥,更利于緩存的靈活配置。如:當(dāng)我們?cè)趕ettings.js中設(shè)置showTagsView為false時(shí)弟断,依然可以使用路由配置的cachePage或者leaveRmCachePage進(jìn)行設(shè)置緩存咏花,TagsView的顯示和隱藏對(duì)緩存沒有影響。
2.和路由配置有關(guān)聯(lián)阀趴,更利于我們對(duì)緩存的使用昏翰。如,我們可以根據(jù)路由配置的cachePage或者leaveRmCachePage刘急,實(shí)現(xiàn)進(jìn)行頁面是否緩存棚菊,和離開頁面頁面是否移除緩存的組合式選擇

1644548683277
那么如果我想實(shí)現(xiàn)之前tab打開時(shí)排霉,頁面緩存窍株,tab關(guān)閉時(shí),移除緩存的功能呢攻柠?

在想實(shí)現(xiàn)此功能頁面的路由上設(shè)置

//如果配置了cachePage: true 則當(dāng)前頁面進(jìn)入后球订,進(jìn)行緩存。 默認(rèn)是false
//若果配置了leaveRmCachePage:true 則當(dāng)前頁離開后瑰钮,頁面會(huì)被移除緩存冒滩。默認(rèn)是false
meta: { title: 'Keep-Alive', cachePage: true, leaveRmCachePage: ture }

cachePage: true, leaveRmCachePage: ture -> 進(jìn)入時(shí)緩存,關(guān)閉時(shí)移除緩存

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浪谴,一起剝皮案震驚了整個(gè)濱河市开睡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苟耻,老刑警劉巖篇恒,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凶杖,居然都是意外死亡胁艰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門智蝠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腾么,“玉大人,你說我怎么就攤上這事杈湾〗馐” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵漆撞,是天一觀的道長殴泰。 經(jīng)常有香客問我于宙,道長,這世上最難降的妖魔是什么艰匙? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任限煞,我火速辦了婚禮抹恳,結(jié)果婚禮上员凝,老公的妹妹穿的比我還像新娘。我一直安慰自己奋献,他們只是感情好健霹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瓶蚂,像睡著了一般糖埋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窃这,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天瞳别,我揣著相機(jī)與錄音,去河邊找鬼杭攻。 笑死祟敛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兆解。 我是一名探鬼主播馆铁,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼锅睛!你這毒婦竟也來了埠巨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤现拒,失蹤者是張志新(化名)和其女友劉穎辣垒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體印蔬,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勋桶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扛点。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哥遮。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陵究,靈堂內(nèi)的尸體忽然破棺而出眠饮,到底是詐尸還是另有隱情,我是刑警寧澤铜邮,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布仪召,位于F島的核電站寨蹋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扔茅。R本人自食惡果不足惜已旧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望召娜。 院中可真熱鬧运褪,春花似錦、人聲如沸玖瘸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雅倒。三九已至璃诀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔑匣,已是汗流浹背劣欢。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裁良,地道東北人凿将。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像趴久,于是被迫代替她去往敵國和親丸相。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353