Vue-Router實(shí)現(xiàn)前端頁面緩存

一敞掘、使用情景

在使用Vue開發(fā)單頁面應(yīng)用時(shí),我們通常會(huì)使用Vue-Router進(jìn)行頁面導(dǎo)航,Vue-Router在進(jìn)行路由切換的時(shí)候,頁面是會(huì)重新加載趴久,對應(yīng)的生命周期函數(shù)也會(huì)再次執(zhí)行一遍,但是在有些業(yè)務(wù)場景下搔确,
比如:

  • 在有分頁數(shù)據(jù)列表中彼棍,切換到第三頁需要查看列表對應(yīng)數(shù)據(jù)的詳情頁面,然后返回妥箕,如果不加任何處理滥酥,列表頁面會(huì)重新加載,默認(rèn)顯示第一頁數(shù)據(jù)畦幢,而不在是之前的第三頁坎吻,這樣如果還需要查看之前查看數(shù)據(jù)的下一條時(shí),還需要切換到第三頁宇葱,如此反復(fù)瘦真。
  • 在列表頁面進(jìn)行條件篩選查詢,查詢到對應(yīng)的數(shù)據(jù)后查詢詳情黍瞧,跳轉(zhuǎn)詳情頁面诸尽,然后在返回,列表默認(rèn)會(huì)清空查詢條件印颤,顯示所有數(shù)據(jù)您机。

以上兩種情景都會(huì)帶來很不好的用戶體驗(yàn)。此時(shí)年局,就需要對列表頁面進(jìn)行路由緩存际看。在Vue-Router中可以使用keep-alive進(jìn)行路由頁面緩存。

二矢否、keep-alive基本認(rèn)識(shí)

  • Vue中提供了一個(gè)內(nèi)置組件keep-alive仲闽,使用<keep-alive>元素將動(dòng)態(tài)組件包裹起來,內(nèi)部組件就會(huì)被緩存起來僵朗。
  • <keep-alive>包裹的組件赖欣,加載過的頁面屑彻,再次進(jìn)入時(shí),是不會(huì)執(zhí)行頁面第一次進(jìn)入時(shí)的部分生命周期函數(shù)顶吮。
  • <keep-alive>包裹的組件會(huì)新增兩個(gè)生命周期函數(shù)activateddeactivated.
  • 兩個(gè)屬性includeexclude可以讓<keep-alive>實(shí)現(xiàn)有條件的進(jìn)行緩存社牲。include包含的組件會(huì)被進(jìn)行緩存,exclude包含的組件不會(huì)被緩存悴了。

三膳沽、keep-alive實(shí)現(xiàn)路由頁面緩存

通過keep-alive實(shí)現(xiàn)路由頁面緩存有兩種如下兩種方式:

(一)、使用include控制需要緩存的頁面

// home.vue
<template>
 <div>
   ...
  <keep-alive :include='cashViews'>
    <router-view></router-view>
  </keep-alive>
 </div>
</template>  
<script>
  export default{
    data() {
      return {
        // 要緩存的組件
        cashViews: ['list']
      }
    }
  }
</script>    
// list.vue
<script>
  export default{
    // 在組件內(nèi)路由守衛(wèi)鉤子函數(shù)中處理邏輯
    beforeRouteEnter (to, from, next) {
      if (from.name === 'Index') { // 處理頁面緩存后让禀,返回首頁再次進(jìn)入緩存頁時(shí)數(shù)據(jù)為更新
        // 該生命周期無法獲取到this,因此把vm實(shí)例當(dāng)作參數(shù)傳遞
        next(vm => {
          vm.pages.pageNum = 1
          // 因?yàn)槲疫@里查詢表單是動(dòng)態(tài)的陨界,所以首頁進(jìn)入時(shí)需要調(diào)用一次巡揍,在改方法中請求返回后調(diào)用了獲取列表數(shù)據(jù)getTableDatas方法
          vm.getQueryList()
        })
      } else if (!from.name) { // 處理刷新頁面時(shí),獲取動(dòng)態(tài)表單方法未執(zhí)行菌瘪,導(dǎo)致表單無法加載
        next(vm => {
          vm.getQueryList()
        })
      } else {
        // 詳情返回時(shí)只更新列表數(shù)據(jù)腮敌,因?yàn)槿绻谠斍轫撁孀隽瞬僮鳎斜頂?shù)據(jù)狀態(tài)會(huì)改變俏扩,其他使用緩存
        next(vm => {
          vm.getTableDatas()
        })
      }
    }
  }
</script>

以上實(shí)現(xiàn)糜工,是針對我自己項(xiàng)目業(yè)務(wù)場景的實(shí)現(xiàn),如果查詢表單不是動(dòng)態(tài)獲取的录淡,是頁面寫死的捌木,可以在activated鉤子中調(diào)用查詢列表數(shù)據(jù)方法。這樣每次進(jìn)入的緩存頁面的時(shí)候嫉戚,只會(huì)更新列表數(shù)據(jù)刨裆,不會(huì)改變其他緩存。

問題:同樣會(huì)存在彬檀,列表緩存數(shù)據(jù)后帆啃,返回首頁,再次進(jìn)入列表頁面窍帝,緩存數(shù)據(jù)還在努潘,這樣可以在路由守衛(wèi)beforeRouterLeave鉤子中處理。

  activated() {
   this.getTableDatas()
  },
  beforeRouterLeave(to, from, next) {
  if (from.name === 'Index') {
    // 如果從首頁進(jìn)入時(shí)調(diào)用重置方法
    this.reset()
  }
}
  • 兩點(diǎn)注意:

    • 要緩存的路由組件必須設(shè)置name屬性坤学,跟cashViews中的值對應(yīng)疯坤;
    • 如果要緩存的組件比較多時(shí),可以使用vuex管理cashViews拥峦。

(二)贴膘、根據(jù)v-if控制顯示的router-view

  1. 在路由表routes中配置meta屬性,新增keepAlive屬性略号,需要緩存的頁面設(shè)置keepAlivetrue.
{
  path: '/list',
  name: 'List',
  component: List,
  meta: {
    keepAlive: true
  }
}
  1. 根據(jù)當(dāng)前訪問路由的keepAlive值控制是否緩存組件
// home.vue
<template>
  ...
  <keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
  </keep-alive>
  <router-view v-if="!$route.meta.keepAlive"></router-view>
</template>
  1. 在組件的守衛(wèi)鉤子中修改keepAlive的值刑峡,控制頁面緩存與否
// List.vue
export default {
  /* 從List組件離開時(shí),修改keepAlive值為false洋闽,保證進(jìn)入該頁面時(shí)頁面刷新
  */
  beforeRouteLeave(to, from, next) {
    from.meta.keepAlive = false
    next()
  }
}
// Detail.vue
export default {
  /*從Detail返回List時(shí),修改List的keepAlive為true,確保返回List頁面時(shí)使用緩存不刷新頁面
  */
  beforeRouteLeave(to, from, next){
    if(to.name === 'List') {
      to.meta.keepAlive = true
    }
    next()
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末突梦,一起剝皮案震驚了整個(gè)濱河市诫舅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宫患,老刑警劉巖刊懈,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異娃闲,居然都是意外死亡虚汛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門皇帮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卷哩,“玉大人,你說我怎么就攤上這事属拾〗辏” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵渐白,是天一觀的道長尊浓。 經(jīng)常有香客問我,道長纯衍,這世上最難降的妖魔是什么栋齿? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮襟诸,結(jié)果婚禮上褒颈,老公的妹妹穿的比我還像新娘。我一直安慰自己励堡,他們只是感情好谷丸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著应结,像睡著了一般刨疼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹅龄,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天揩慕,我揣著相機(jī)與錄音,去河邊找鬼扮休。 笑死迎卤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玷坠。 我是一名探鬼主播蜗搔,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼劲藐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了樟凄?” 一聲冷哼從身側(cè)響起聘芜,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缝龄,沒想到半個(gè)月后汰现,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叔壤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年瞎饲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炼绘。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡企软,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饭望,到底是詐尸還是另有隱情,我是刑警寧澤形庭,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布铅辞,位于F島的核電站,受9級特大地震影響萨醒,放射性物質(zhì)發(fā)生泄漏斟珊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一富纸、第九天 我趴在偏房一處隱蔽的房頂上張望囤踩。 院中可真熱鬧,春花似錦晓褪、人聲如沸堵漱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勤庐。三九已至,卻和暖如春好港,著一層夾襖步出監(jiān)牢的瞬間愉镰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工钧汹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丈探,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓拔莱,卻偏偏與公主長得像碗降,于是被迫代替她去往敵國和親隘竭。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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