keep-alive 緩存

緩存的場景各種各樣,稍微一改代碼就大不相同证杭。
所以我寫的只是這一種場景:緩存一個頁面(只是一個頁面携丁!)魄宏,并且記錄下這個頁面的滾動位置。

必要的因素:

1.因為設(shè)置滾動是在router.js里scrollBehavior:設(shè)置的是 body滾動距離券册,所以這個頁面不能有其他可以滾動的標(biāo)簽烁焙。

2.像mint-ui的上拉加載組件是父節(jié)點必須有overflow:hidden.所以也不能使用九火。

3.最好不要有tabbar鹦倚,或者有的話在下面再加一個相等高度的div。要不然看不到最下面的東西。

用到的功能點:

1.記錄滾動距離: window.addEventListener('scroll', this.handleScroll);

2.設(shè)置body滾動距離:router.js里scrollBehavior

3.記錄緩存組件:app.vue:<keep-alive>

正式開始:
1.在app.vue文件:

  <div id="app">
    <!-- 緩存需要 -->
    <keep-alive :max='1'>      
        <router-view v-if="$route.meta.keepAlive"/>    
    </keep-alive>    
    <router-view v-if="!$route.meta.keepAlive"/>
  </div>

官網(wǎng)有keep-alive詳細(xì)的解釋-->傳送門
我這里用到了max解釋:max - 數(shù)字封恰。最多可以緩存多少組件實例麻养。
就是我上面提到的我只緩存一個實例
而$route.meta.keepAlive在router.js里設(shè)置

2.router.js:

  {
          path:'/index3',
          name:'index3',
          meta:{keepAlive:true},
          component:() => import('./views/index3.vue')
        },

3.這個時候就可以緩存頁面了。接下來是保存頁面滾動距離俭驮。
緩存頁面它有自己的生命周期:
activated:組件激活時調(diào)用
deactivated:組件停用時調(diào)用回溺。
每次進(jìn)緩存頁面時都要記錄滾動距離,所以在 activated 里調(diào)用函數(shù)并且滾動距離及時保存在sessionStorage:
index3.vue :

        mounted () {
            window.addEventListener('scroll', this.handleScroll);
        },
        // 緩存組件的話,第二次是不走mounted的混萝,
        activated() {
            window.addEventListener('scroll', this.handleScroll);
        },
 methods: {
             handleScroll () {
                let scrollY = window.scrollY
                sessionStorage.setItem('height',JSON.stringify({h:scrollY}));
                // console.log(scrollY,'scrollYindex333')
             }, 
        
        },

4.因為這個window.scrollY是全局的遗遵,所以在這個組件銷毀時清除this.handleScroll

 deactivated () {
            window.removeEventListener('scroll', this.handleScroll)
        }

5.記錄頁面滾動距離成功,這時候再進(jìn)這個頁面就要設(shè)置頁面的滾動距離了逸嘀,
在router.js里:

export default new Router({
routes:{
.......
},
   scrollBehavior (to, from, savedPosition) {
      // 從 A ---->  B
      //   from     to
      // console.log(to,'to---------')
      if (to.name === 'index3') {
        // 拿到滾動距離3狄!崭倘!
        let num = JSON.parse(sessionStorage.getItem('height'))
        num = num ? num : 0
        return { x: 0, y: num.h }
      } 
    }

下面是index3的全部代碼:

<template>
    <div>
            index3
            <p>------分割線1---------</p>
            <p>------分割線2---------</p>
            <p>------分割線3---------</p>
            <p>------分割線4---------</p>
            <p>------分割線5---------</p>
            <input type="text" style="height:60px;color:red">
            <p>------分割線6---------</p>
            <p>------分割線7---------</p>
            <p>------分割線8---------</p>
            <p>------分割線9---------</p>
            <p>------分割線10---------</p>
            <p>------分割線11---------</p>
            <p>------分割線12---------</p>
            <p>------分割線13---------</p>
            <p>------分割線14---------</p>
            <p>------分割線15---------</p>
            <p>------分割線16---------</p>
            <p>------分割線1---------</p>
            <p>------分割線2---------</p>
            <p>------分割線3---------</p>
            <p>------分割線4---------</p>
            <p>------分割線5---------</p>
    </div>
</template>
<script>
  export default {
        name: 'index3',
        data() {
            return {}
        },
        methods: {
             handleScroll () {
                let scrollY = window.scrollY
                sessionStorage.setItem('height',JSON.stringify({h:scrollY}));
                // console.log(scrollY,'scrollYindex333')
             }, 
        
        },
        // 及時地銷毀
        mounted () {
            window.addEventListener('scroll', this.handleScroll);
        },
        destroyed () {
        /* 加上keep-alive 則這個生命周期就不會走了翼岁。。司光。所以把清除放到deactivated */
        },
        // 緩存組件的話琅坡,第二次是不走mounted的,
        activated() {
            window.addEventListener('scroll', this.handleScroll);
        },
        deactivated () {
            window.removeEventListener('scroll', this.handleScroll)
        }
    }
</script>
<style>

</style>

經(jīng)歷了一周的緩存組件較勁残家,以下是我的錯誤示范榆俺。

1>

其實很想動態(tài)清除緩存組件,只是現(xiàn)在還沒有找到最好的解決方案坞淮。網(wǎng)上說的用this.$destroy()這種方法是不可行的茴晋,加上之后緩存頁面不會再緩存,跟正常頁面沒有兩樣回窘。不需要再試了诺擅。

2>

網(wǎng)上說的清除緩存使用this.$vnode.
我沒有試成功,一周了啡直。烁涌。太疲憊了苍碟。。烹玉。
首先我要緩存的組件是二級路由頁面驰怎,壓根打印不到 this.vnode.parent 是null。所以只能是一級路由頁面parent才有值二打。并且我發(fā)現(xiàn)這個parent只有在從緩存組件跳到其他頁面時才會有值。有興趣的可以試試掂榔,這個還沒有弄懂继效。

import Vue from 'vue'

/* Vue.mixin({
  beforeRouteLeave(to, from, next) {
    //   全局觸發(fā)此事件
    //下面是條件
      if(to.name === 'regionalStatistics' && from.name === 'enterpriseQuery') {
        if(this.$vnode.parent && this.$vnode.parent.componentInstance.cache) {
        let key = this.$vnode.key == null
                            ? this.$vnode.componentOptions.Ctor.cid + (this.$vnode.componentOptions.tag ? `::${this.$vnode.componentOptions.tag}` : '')
                            : this.$vnode.key;   // 當(dāng)前關(guān)閉的組件名
        let cache = this.$vnode.parent.componentInstance.cache  // 緩存的組件
        let keys = this.$vnode.parent.componentInstance.keys  // 緩存的組件名
            if(cache[key] != null) {
            
                delete cache[key]
                let index = keys.indexOf(key)
                if(index > -1) {
                keys.splice(index, 1)
                }
            }
        }
      }
    next()
  }
})
 */

3>

其實使用scrollBehavior 弊端是很大的,就是它設(shè)置的只能是body的滾動距離装获,還有另外一種方法:
使用@scroll 也可以監(jiān)聽元素滾動瑞信,并且記錄下來。在頁面渲染時再賦值于元素滾動距離穴豫。
@scroll可以肉眼看到滾動條滾動到指定位置凡简,肯定沒有scrollBehavior 效果好。
但是精肃。秤涩。。我最后用了@scroll司抱,我敗在了mint-ui的上拉加載組件上筐眷。。

<div class='scrollList' @scroll="scroll">
------------------------------------------------------------------------------
 /* 滾動 */
            scroll() {
                let height = document.getElementsByClassName('scrollList')[0].scrollTop
                sessionStorage.setItem('TFD_HEIGHT',JSON.stringify({h:height}));
            },

------------------------------------------------------------------------------

   activated() {
        setTimeout(() => {
            let num = JSON.parse(sessionStorage.getItem('TFD_HEIGHT'))
            document.getElementsByClassName('scrollList')[0].scrollTop = num.h
        },100)
    },

4>

chorme有一個插件 vue Devtools习柠,其中有一個功能可以查看緩存組件匀谣,網(wǎng)上有很多安裝的文章。


image.png

最后的最后资溃,用了這么多紙只為了kepp-alive武翎,還沒有達(dá)到預(yù)期


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市溶锭,隨后出現(xiàn)的幾起案子宝恶,更是在濱河造成了極大的恐慌,老刑警劉巖暖途,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卑惜,死亡現(xiàn)場離奇詭異,居然都是意外死亡驻售,警方通過查閱死者的電腦和手機(jī)露久,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欺栗,“玉大人毫痕,你說我怎么就攤上這事征峦。” “怎么了消请?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵栏笆,是天一觀的道長。 經(jīng)常有香客問我臊泰,道長蛉加,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任缸逃,我火速辦了婚禮针饥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘需频。我一直安慰自己丁眼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布昭殉。 她就那樣靜靜地躺著苞七,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挪丢。 梳的紋絲不亂的頭發(fā)上蹂风,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音吃靠,去河邊找鬼硫眨。 笑死,一個胖子當(dāng)著我的面吹牛巢块,可吹牛的內(nèi)容都是我干的礁阁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼族奢,長吁一口氣:“原來是場噩夢啊……” “哼姥闭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起越走,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤棚品,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后廊敌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铜跑,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年骡澈,在試婚紗的時候發(fā)現(xiàn)自己被綠了锅纺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肋殴,死狀恐怖囤锉,靈堂內(nèi)的尸體忽然破棺而出坦弟,到底是詐尸還是另有隱情,我是刑警寧澤官地,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布酿傍,位于F島的核電站,受9級特大地震影響驱入,放射性物質(zhì)發(fā)生泄漏赤炒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一沧侥、第九天 我趴在偏房一處隱蔽的房頂上張望可霎。 院中可真熱鬧,春花似錦宴杀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绢记,卻和暖如春扁达,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蠢熄。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工跪解, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人签孔。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓叉讥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饥追。 傳聞我的和親對象是個殘疾皇子图仓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354