keep-alive緩存

設(shè)置緩存不生效的解決方案
  • 1刊苍、因?yàn)閗eep-alive組件的include數(shù)組操作的對(duì)象是組件名忠荞、而不是路由名曾掂,因此我們定義每一個(gè)路由組件時(shí)聋亡,都要在組建中顯式聲明name屬性绷旗,而不是在路由上聲明name屬性喜鼓,否則緩存不起作用。而且衔肢,一個(gè)顯式的name對(duì)Vue devtools有提示作用庄岖。
  • 2、對(duì)于一些vue-element-admin之類的后臺(tái)模板中角骤,會(huì)存在多層嵌套的router-view顿锰,在外層的router-view設(shè)置keep-alive緩存不會(huì)對(duì)里層router-view中的頁(yè)面生效,只有在里層router-view中設(shè)置keep-alive緩存才起作用启搂,如果你設(shè)置了頁(yè)面中的name屬性硼控,vue版本也大于2.1,且怎么設(shè)置緩存都不生效的話胳赌,不放看看自己頁(yè)面布局嵌套的問(wèn)題牢撼,一般都能解決。
以下是正文

在vue官方文檔介紹中疑苫,<keep-alive> 包裹動(dòng)態(tài)組件時(shí)熏版,會(huì)緩存不活動(dòng)的組件實(shí)例,而不是銷毀它們捍掺。我們可以看到在2.1.0版本新增了include和exclude屬性撼短,2.5版本新增了max屬性,屬性的特征如下:
include - 字符串或正則表達(dá)式挺勿。只有名稱匹配的組件會(huì)被緩存曲横。
exclude - 字符串或正則表達(dá)式。任何名稱匹配的組件都不會(huì)被緩存不瓶。
max- 數(shù)字禾嫉。最多可以緩存多少組件實(shí)例。
當(dāng)組件在 <keep-alive> 內(nèi)被切換蚊丐,它的 activated 和 deactivated 這兩個(gè)生命周期鉤子函數(shù)將會(huì)被對(duì)應(yīng)執(zhí)行熙参。

keep-alive是個(gè)抽象組件(或稱為功能型組件),實(shí)際上不會(huì)被渲染在DOM樹中麦备。它的作用是在內(nèi)存中緩存組件(不讓組件銷毀)孽椰,等到下次再渲染的時(shí)候昭娩,還會(huì)保持其中的所有狀態(tài),并且會(huì)觸發(fā)activated鉤子函數(shù)黍匾。因?yàn)榫彺娴男枰ǔ3霈F(xiàn)在頁(yè)面切換時(shí)栏渺,所以常與router-view一起出現(xiàn):

如此一來(lái),每一個(gè)在router-view中渲染的組件膀捷,都會(huì)被緩存起來(lái)迈嘹。

如果只想渲染某一些頁(yè)面/組件削彬,可以使用keep-alive組件的include/exclude屬性全庸。include屬性表示要緩存的組件名(即組件定義時(shí)的name屬性),接收的類型為string融痛、RegExp或string數(shù)組壶笼;exclude屬性有著相反的作用,匹配到的組件不會(huì)被緩存雁刷。假如可能出現(xiàn)在同一router-view的N個(gè)頁(yè)面中覆劈,我只想緩存列表頁(yè)和詳情頁(yè),那么可以這樣寫:

<keep-alive :include="['ListView', 'DetailView']">
  <router-view />
</keep-alive>

新增了以上這些api沛励,我們可以叫輕松的實(shí)現(xiàn)路由的緩存责语,假如有以下的使用場(chǎng)景:

  • 現(xiàn)有頁(yè)面:首頁(yè)(A)、列表頁(yè)(B)目派、詳情頁(yè)(C)坤候,一般可以從:A->B->C;
  • B到C再返回B時(shí)企蹭,B要保持原有的狀態(tài)白筹;
  • B返回A再進(jìn)入B時(shí),B不需要保持狀態(tài)谅摄,是全新的徒河。

很明顯,這個(gè)例子中送漠,B是“條件緩存”的顽照,C->B時(shí)保持緩存,A->B時(shí)放棄緩存闽寡。其實(shí)解決方案也不難棒厘,只需要將B動(dòng)態(tài)地從include數(shù)組中增加/刪除就行了。具體步驟是:

1下隧、在Vuex中定義一個(gè)全局的緩存數(shù)組奢人,待傳給include:

const keepAlive = {
  state: {
    keepAliveRoute: []
  },
  mutations: {
    keepAlive: (state, component) => {
      !state.keepAliveRoute.includes(component) &&
      state.keepAliveRoute.push(component)
    },
    noKeepAlive: (state, component) => {
      const index = state.keepAliveRoute.indexOf(component)
      if (index !== -1) {
        state.keepAliveRoute.splice(index, 1)
      }
    }
  }
}
export default keepAlive

2、在父頁(yè)面中定義keep-alive淆院,并傳入全局的緩存數(shù)組:

<template>
  <div style="width:100%;height:100%">
    <keep-alive :include="keepAliveRoute">
      <router-view></router-view>
    </keep-alive>
  </div>
</template>

<script>
import { mapState } from 'vuex'
export default {
  computed: {
    ...mapState({
      keepAliveRoute: state => state.keepAlive.keepAliveRoute
    })
  }
}
</script>

3何乎、緩存:在路由配置頁(yè)中句惯,約定使用meta屬性keepAlive,值為true表示組件需要緩存支救。在全局路由鉤子beforeEach中對(duì)該屬性進(jìn)行處理抢野,這樣一來(lái),每次進(jìn)入該組件各墨,都進(jìn)行緩存:

const router = new Router({
  routes: [
    {
      path: '/A/B',
      name: 'B',
      component: B,
      meta: {
        title: 'B頁(yè)面',
        keepAlive: true // 這里指定B組件的緩存性
      }
    }
  ]
})

4指孤、在全局路由鉤子beforeEach中添加以下代碼:

router.beforeEach((to, from, next) => {
  // 在路由全局鉤子beforeEach中,根據(jù)keepAlive屬性贬堵,統(tǒng)一設(shè)置頁(yè)面的緩存性
  // 作用是每次進(jìn)入該組件恃轩,就將它緩存
   if (to.meta.keepAlive) {
    store.commit('keepAlive', to.name)
  }
})

5、取消緩存的時(shí)機(jī):對(duì)緩存組件使用路由的組件層鉤子beforeRouteLeave黎做。因?yàn)锽->A->B時(shí)不需要緩存B叉跛,所以可以認(rèn)為:當(dāng)B的下一個(gè)頁(yè)面不是C時(shí)取消B的緩存,那么下次進(jìn)入B組件時(shí)B就是全新的:

beforeRouteLeave (to, from, next) {
    if (to.name !== 'regFormDetail') {
      this.$store.commit('noKeepAlive', from.name)
    }
    next()
  }

因?yàn)锽的條件緩存蒸殿,是B自己的職責(zé)筷厘,所以最好把該業(yè)務(wù)邏輯寫在B的內(nèi)部,而不是A中宏所,這樣不至于讓組件之間的跳轉(zhuǎn)關(guān)系變得混亂酥艳。

詳情頁(yè)面:

beforeRouteLeave (to, from, next) {
    if (to.name !== 'regFormList' && to.name !== 'regFormSearch') {
      this.$store.commit('noKeepAlive', 'regFormSearch')
    }
    next()
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市爬骤,隨后出現(xiàn)的幾起案子充石,更是在濱河造成了極大的恐慌,老刑警劉巖盖腕,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赫冬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡溃列,警方通過(guò)查閱死者的電腦和手機(jī)劲厌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)听隐,“玉大人补鼻,你說(shuō)我怎么就攤上這事⊙湃危” “怎么了风范?”我有些...
    開(kāi)封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沪么。 經(jīng)常有香客問(wèn)我硼婿,道長(zhǎng),這世上最難降的妖魔是什么禽车? 我笑而不...
    開(kāi)封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任寇漫,我火速辦了婚禮刊殉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘州胳。我一直安慰自己记焊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布栓撞。 她就那樣靜靜地躺著遍膜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓤湘。 梳的紋絲不亂的頭發(fā)上瓢颅,一...
    開(kāi)封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音岭粤,去河邊找鬼惜索。 笑死特笋,一個(gè)胖子當(dāng)著我的面吹牛剃浇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猎物,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼虎囚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蔫磨?” 一聲冷哼從身側(cè)響起淘讥,我...
    開(kāi)封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堤如,沒(méi)想到半個(gè)月后蒲列,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搀罢,尸身上長(zhǎng)有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
  • 文/蒙蒙 一掸犬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绪爸,春花似錦湾碎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至递惋,卻和暖如春柔滔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萍虽。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工睛廊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杉编。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓超全,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親邓馒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘶朱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容