vue 使用keep-alive 三級(jí)以上的路由陋气,無法緩存問題巩趁!

使用vue-element-admin腳手架做系統(tǒng)時(shí),一般系統(tǒng)的側(cè)邊欄都是有父級(jí)议慰,子級(jí)别凹,子子級(jí),發(fā)現(xiàn)使用keep-alive到涂,當(dāng)三級(jí)以上的路由時(shí),無法緩存頁面浇雹?屿讽?

那首先要了解下keep-alive的作用是啥?
  • 是用來對(duì)頁面組件進(jìn)行緩存不緩存的處理烂完,擁有緩存頁面組件诵棵,再次進(jìn)入時(shí)履澳,使用原來已經(jīng)加載好的內(nèi)容,可以大大的節(jié)省請(qǐng)求和渲染時(shí)間柄冲,是個(gè)好東西忠蝗!

相關(guān)的文章介紹很多,就不贅述了戒祠。闽撤。。(感興趣的多查查其他文章)
那它具體的屬性有2種:

  • include ,包含頁面組件name的這些組件頁面,會(huì)被緩存起來
  • exclude 除了這些name以外的頁面組件闸餐,會(huì)被緩存起來
  • 還有第3種矾芙,如下這樣寫(即沒有include或者exclude屬性,表示所有的路由組件都會(huì)被緩存起來7髡 !)
    如下所示:
<keep-alive>
  <router-view :key="key" />
</keep-alive>

computed: {
 key() {
  return this.$route.path
 }
}

注意這里有個(gè)坑點(diǎn):

  • 發(fā)現(xiàn)keep-alive中的include屬性或者exclude屬性都不管用斗锭!后來查閱了一番岖是,發(fā)現(xiàn)這個(gè)include 或者exclude的name 是頁面組件里面具體的name实苞, 就像這樣:(凡是是路由組件,在對(duì)應(yīng)的這個(gè)組件頁面顯示的添著補(bǔ)上對(duì)應(yīng)的name屬性按辖巍猾浦!別偷懶T狙病)
1.png

(1)官方vue組件的name的命名方式,參考鏈接: https://cn.vuejs.org/v2/guide/components-registration.html

這里外莲,由于默認(rèn)的eslint配置文件.eslintrc.js中兔朦,如下:


2.png

即頁面組件的name , 如果不是大寫字母開頭沽甥,就會(huì)飄紅報(bào)錯(cuò)。(我有點(diǎn)強(qiáng)迫癥)所以頁面所有的路由組件具體頁面的name亥曹,我都以大寫字母開始命名

(2)這個(gè)具體vue組件頁面的name要跟你router文件中配置的name一樣
因?yàn)樵诿看未蜷_標(biāo)簽頁和關(guān)閉標(biāo)簽頁處理時(shí)媳瞪,是根據(jù)name來匹配照宝,進(jìn)行添加刪除。如果組件內(nèi)部頁面配置的name是Order,而路由文件配置的name是order,那include和exclude也不會(huì)有用兢仰!

準(zhǔn)備工作做好了后,就可以使用keep-alive 啦

include 屬性進(jìn)行緩存頁面組件的操作了轻专,實(shí)現(xiàn)參考了github這篇: https://github.com/PanJiaChen/vue-element-admin/commit/9ad96525af3a26c2f4e8d4e9016f801c44df1f80

上面這個(gè)鏈接的代碼秸弛,實(shí)現(xiàn)了三級(jí)路由以上的緩存處理:(但還會(huì)有個(gè)問題递览,刷新或者關(guān)閉當(dāng)前標(biāo)簽頁叼屠,再次打開時(shí),清除不了當(dāng)前組件的緩存(比如搜索條件寫了個(gè)東西绞铃,進(jìn)行搜索镜雨,關(guān)閉或者刷新后,應(yīng)該清空重新請(qǐng)求儿捧,但還是保留荚坞。。我們后面會(huì)解決的菲盾,先接著往下看~))

上述鏈接的解決的思路如下:


3.png
  • 代碼如下:(三級(jí)路由根頁面代碼)
Parent
<script>
export default {
  name: 'Menu1',
  data() {
  return {
      ...
   }
 },
 created() {
   const route = this.$route.matched.find(item => item.name === 'Menu1')
   this.$store.dispatch('tagsView/addCachedView', route)
 }
}
</script>

注: 上述組件的name值和find比較的name 值要均保持一致颓影,這里,如果當(dāng)前組件的name改變了后懒鉴,代碼改動(dòng)的地方有2處诡挂,有沒有更取巧的方式呢临谱,如下代碼璃俗,就可以直接獲取當(dāng)前組件的name, 而不用相同的name寫兩遍

this.$options.name

所以上述代碼,我們有可以改寫成這樣:

Parent
<script>
export default {
  name: 'Menu1',
  data() {
  return {
      ...
   }
 },
 created() {
   const route = this.$route.matched.find(item => item.name === this.$options.name)
   this.$store.dispatch('tagsView/addCachedView', route)
 }
}
</script>

那又回到剛才說的問題了悉默,刷新或者關(guān)閉再打開當(dāng)前3級(jí)路由的標(biāo)簽頁時(shí)城豁,緩存未清空?

問題總是有解決辦法的抄课,參考鏈接是這個(gè)issue: https://github.com/PanJiaChen/vue-element-admin/pull/3116

tagsView.js

addCachedView({ commit }, view) {
   if (view.matched && view.matched.length >= 3) { // 若為三級(jí)及其以上路由點(diǎn)擊打開標(biāo)簽頁時(shí)唱星,將三級(jí)路由或以上的根目錄路由塞入緩存路由name list中
   commit('ADD_CACHED_VIEW', view.matched[1])
  }
   commit('ADD_CACHED_VIEW', view) // 反之,正常的進(jìn)行標(biāo)簽頁的添加進(jìn)緩存路由name list中
},


delCachedView({ commit, state }, view) {
  return new Promise(resolve => {
    if (view.matched && view.matched.length >= 3) { // 若為三級(jí)及其以上路由關(guān)閉當(dāng)前標(biāo)簽頁時(shí)跟磨,將3級(jí)路由以上的根目錄name 從list中刪除
    commit('DEL_CACHED_VIEW', view.matched[1])
  }
   commit('DEL_CACHED_VIEW', view) // 反之魏颓,正常的進(jìn)行標(biāo)簽頁的name 從list中刪除
   resolve([...state.cachedViews])
  })
},

以上解決問題啦~~<( ̄▽ ̄)/

還要注意的是:

AppMain.vue里這樣寫:(注意include方法,取的是cachedViews)

<template>
  <section class="app-main">
    <transition name="fade-transform" mode="out-in">
      <keep-alive :include="cachedViews">
        <router-view :key="key" />
      </keep-alive>
    </transition>
  </section>
</template>


<script>
export default {
  name: 'AppMain',
  computed: {
    cachedViews() {
      return this.$store.state.tagsView.cachedViews
    },
    key() {
      return this.$route.path
    }
  }
}
</script>
<style scope>
...
</style>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吱晒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沦童,更是在濱河造成了極大的恐慌仑濒,老刑警劉巖叹话,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異墩瞳,居然都是意外死亡驼壶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門喉酌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來热凹,“玉大人,你說我怎么就攤上這事泪电“忝睿” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵相速,是天一觀的道長(zhǎng)碟渺。 經(jīng)常有香客問我,道長(zhǎng)突诬,這世上最難降的妖魔是什么苫拍? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮旺隙,結(jié)果婚禮上绒极,老公的妹妹穿的比我還像新娘。我一直安慰自己蔬捷,他們只是感情好垄提,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抠刺,像睡著了一般塔淤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上速妖,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天高蜂,我揣著相機(jī)與錄音,去河邊找鬼罕容。 笑死备恤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锦秒。 我是一名探鬼主播露泊,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼旅择!你這毒婦竟也來了惭笑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沉噩,沒想到半個(gè)月后捺宗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡川蒙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蚜厉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畜眨。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昼牛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出康聂,到底是詐尸還是另有隱情贰健,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布早抠,位于F島的核電站霎烙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蕊连。R本人自食惡果不足惜悬垃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甘苍。 院中可真熱鬧尝蠕,春花似錦、人聲如沸载庭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囚聚。三九已至靖榕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顽铸,已是汗流浹背茁计。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谓松,地道東北人星压。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鬼譬,于是被迫代替她去往敵國(guó)和親娜膘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345