keep-alive緩存優(yōu)化實踐總結

keep-alive緩存優(yōu)化實踐總結

keep-alive

<keep-alive>是Vue的內置組件缕减,能在組件切換過程中將狀態(tài)保留在內存中杂彭,防止重復渲染DOM嘱能。
<keep-alive> 包裹動態(tài)組件時,會緩存不活動的組件實例物延,而不是銷毀它們。和 <transition> 相似,<keep-alive> 是一個抽象組件:它自身不會渲染一個 DOM 元素澎怒,也不會出現(xiàn)在父組件鏈中。

具體應用場景

搜索列表頁==>詳情頁==>返回列表頁阶牍,保存上次已經(jīng)加載出來的數(shù)據(jù)和自動還原上次的瀏覽位置

keep-alive鉤子函數(shù)

?先簡單說一下和緩存相關的vue鉤子函數(shù)喷面。
?對于設置了keepAlive緩存的組件:
??第一次進入:beforeRouterEnter->created->activated->deactivated
??后續(xù)進入時:beforeRouterEnter ->activated->deactivated
可以看出,只有第一次進入該組件時走孽,才會走created鉤子惧辈,而需要緩存的組件中activated是每次都會走的鉤子函數(shù)。所以磕瓷,為了避免重復請求盒齿,我們要在activated這個鉤子里面去判斷,當前組件是需要使用緩存的數(shù)據(jù)還是重新刷新獲取數(shù)據(jù)困食。

prop:

include: 字符串或正則表達式边翁。只有匹配的組件會被緩存。
exclude: 字符串或正則表達式硕盹。任何匹配的組件都不會被緩存符匾。

常見用法:

// 組件
export default {
  name: 'test-keep-alive',
  data () {
    return {
        includedComponents: "test-keep-alive"
    }
  }
}
<keep-alive include="test-keep-alive">
  <!-- 將緩存name為test-keep-alive的組件 -->
  <component></component>
</keep-alive>

<keep-alive include="a,b">
  <!-- 將緩存name為a或者b的組件,結合動態(tài)組件使用 -->
  <component :is="view"></component>
</keep-alive>

<!-- 使用正則表達式瘩例,需使用v-bind -->
<keep-alive :include="/a|b/">
  <component :is="view"></component>
</keep-alive>

<!-- 動態(tài)判斷 -->
<keep-alive :include="includedComponents">
  <router-view></router-view>
</keep-alive>

<keep-alive exclude="test-keep-alive">
  <!-- 將不緩存name為test-keep-alive的組件 -->
  <component></component>
</keep-alive>

結合router實現(xiàn)步驟

  • 保存上次已經(jīng)加載出來的數(shù)據(jù)

需要在<button>router</button>中設置router的元信息meta啊胶,(scrollTop屬性的設置為了保存瀏覽位置,后面再說):

    export const constantRouterMap = 
    [{
        path: 'index',
        name: 'list',
        hidden: true,
        meta: { title: '客戶管理', keepAlive: true, scrollTop: 0 },
        component: () => import('@/views/List')
      },
      {
        path: 'clientInfo',
        name: 'clientInfo',
        hidden: true,
        component: () => import('@/views/clientInfo/index'),
        meta: { title: '客戶信息', icon: 'icon-yejiguanli', keepAlive: true }
    }]
    export default new Router({
      mode: 'history',
      routes: constantRouterMap,
      scrollBehavior: () => ({ y: 0 })
    })

在頁面中的路由容器里設置keep-alive標簽

<template>
  <keep-alive v-if="$route.meta.keepAlive">
    <router-view/>
  </keep-alive>
  <router-view v-else-if="!$route.meta.keepAlive"/>
</template>
<script>
export default {
  name: 'List'
}
</script>
  • 保留頁面滾動位置
    首次進入頁面時垛贤,scrollTop = 0焰坪,如上面所說,在設置keep-alive的頁面南吮,一定會走activated方法琳彩,當頁面中存在滾動條,路由跳轉的兩個場景:
    • 離開列表頁進入詳情頁(修改本頁面的路由元信息scrollTop為當前滾動位置)
    • 離開列表頁進入其他平級頁面(修改本頁面的路由元信息scrollTop為0)
const myMixin = {
  activated() {
    document.querySelector('#app').scrollTop = this.$route.meta.scrollTop
  },
  beforeRouteLeave(to, from, next) {
    if (to.name.includes('clientInfo')) {
      const scrollTop = document.querySelector('#app').scrollTop
      from.meta.scrollTop = scrollTop
    } else {
      from.meta.scrollTop = 0
    }
    next()
  }
}

頁面中列表較多的情況下,我們把activated方法和beforeRouteLeave方法抽離出來復用露乏,頁面中引用進來即可:

import myMixin from '@/utils/mixin.js'
export default {
  name: 'List',
  mixins: [myMixin]
}

暫且總結這么多碧浊,希望對大家有幫助!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瘟仿,一起剝皮案震驚了整個濱河市箱锐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劳较,老刑警劉巖驹止,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異观蜗,居然都是意外死亡臊恋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門墓捻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抖仅,“玉大人,你說我怎么就攤上這事砖第〕仿” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵梧兼,是天一觀的道長放吩。 經(jīng)常有香客問我,道長羽杰,這世上最難降的妖魔是什么渡紫? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮忽洛,結果婚禮上腻惠,老公的妹妹穿的比我還像新娘。我一直安慰自己欲虚,他們只是感情好集灌,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著复哆,像睡著了一般欣喧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梯找,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天唆阿,我揣著相機與錄音,去河邊找鬼锈锤。 笑死驯鳖,一個胖子當著我的面吹牛闲询,可吹牛的內容都是我干的。 我是一名探鬼主播浅辙,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼扭弧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了记舆?” 一聲冷哼從身側響起鸽捻,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泽腮,沒想到半個月后御蒲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡诊赊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年厚满,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碧磅。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡痰滋,死狀恐怖,靈堂內的尸體忽然破棺而出续崖,到底是詐尸還是另有隱情,我是刑警寧澤团搞,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布严望,位于F島的核電站,受9級特大地震影響逻恐,放射性物質發(fā)生泄漏像吻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一复隆、第九天 我趴在偏房一處隱蔽的房頂上張望拨匆。 院中可真熱鬧,春花似錦挽拂、人聲如沸惭每。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽台腥。三九已至,卻和暖如春绒北,著一層夾襖步出監(jiān)牢的瞬間黎侈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工闷游, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峻汉,地道東北人贴汪。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像休吠,于是被迫代替她去往敵國和親扳埂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353