03-vue中前進刷新楣导、后退緩存用戶瀏覽數(shù)據(jù)和瀏覽位置的實踐

原文地址:https://juejin.cn/post/6844903624099758094

vue中丸冕,我們所要實現(xiàn)的一個場景就是:
1.搜索頁面==>到搜索結(jié)果頁時沫勿,搜索結(jié)果頁面要重新獲取數(shù)據(jù),
2.搜索結(jié)果頁面==>點擊進入詳情頁==>從詳情頁返回列表頁時区拳,要保存上次已經(jīng)加載的數(shù)據(jù)和自動還原上次的瀏覽位置拘领。

緩存組件:

vue2中提供了keep-alive。首先在我們的app.vue中定義keep-alive:

<keep-alive>      
    <router-view v-if="$route.meta.keepAlive"/>    
</keep-alive>    
<router-view v-if="!$route.meta.keepAlive"/>

這里是根據(jù)路由中的meta源信息中的keepAlive字段來判斷當前路由組件是否需要緩存樱调。這里的meta的keepAlive是我們自定義的约素,當然你也可以叫別的名字。
下面在router/index.js即我們的路由文件中笆凌,定義meta信息:

// list是我們的搜索結(jié)果頁面
{      
    path: '/list',  
    name: 'List',      
    component: resolve => require(['@/pages/list'], resolve),    
    meta: {        
        isUseCache: false,  // 這個字段的意思稍后再說      
        keepAlive: true  // 通過此字段判斷是否需要緩存當前組件  
    }    
},

如此一來圣猎,vue的路由會幫我們?nèi)ゾ彺鎙ist頁面。

刷新數(shù)據(jù)or緩存數(shù)據(jù)的實現(xiàn):

說這之前乞而,先簡單說一下和緩存相關(guān)的vue鉤子函數(shù)送悔。
設(shè)置了keepAlive緩存的組件:

  • 第一次進入:beforeRouterEnter ->created->…->activated->…->deactivated
  • 后續(xù)進入時:beforeRouterEnter ->activated->deactivated
    可以看出,只有第一次進入該組件時,才會走created鉤子欠啤,而需要緩存的組件中activated是每次都會走的鉤子函數(shù)荚藻。所以,我們要在這個鉤子里面去判斷洁段,當前組件是需要使用緩存的數(shù)據(jù)還是重新刷新獲取數(shù)據(jù)应狱。思路有了,下面我們來實現(xiàn):
// list組價的activated鉤子
activated() {
    // isUseCache為false時才重新刷新獲取數(shù)據(jù)
    // 因為對list使用keep-alive來緩存組件祠丝,所以默認是會使用緩存數(shù)據(jù)的         
    if(!this.$route.meta.isUseCache){            
        this.list = []; // 清空原有數(shù)據(jù)
        this.onLoad(); // 這是我們獲取數(shù)據(jù)的函數(shù)
    } 
},

這里的isUseCache 其實就是我們用來判斷是否需要使用緩存數(shù)據(jù)的字段疾呻,我們在list的路由的meta中已經(jīng)默認設(shè)置為false,所以第一次進入list時是獲取數(shù)據(jù)的写半。
由于我們只要列表到詳情頁的時候緩存列表頁的數(shù)據(jù)岸蜗,所以我們要在列表頁的beforeRouteLeave的鉤子判斷,如果前往的是詳情頁面叠蝇,則緩存數(shù)據(jù):

// 列表頁面的beforeRouteLeave鉤子函數(shù)
beforeRouteLeave (to, from, next) {        
    if (to.name == 'Detail') {
        from.meta.isUseCache = true;    
    }        
    next();
},

現(xiàn)在璃岳,detail返回list頁面。list頁面已經(jīng)被緩存數(shù)據(jù)了蟆肆,那么現(xiàn)在如果前往search頁面后再前往list頁面時怎么讓list頁面不使用緩存數(shù)據(jù)而是獲取新數(shù)據(jù)呢矾睦?答案就在list頁面的activated鉤子中:

// list組價的activated鉤子
 activated() {
    // isUseCache為false時才重新刷新獲取數(shù)據(jù)
    // 因為對list使用keep-alive來緩存組件,所以默認是會使用緩存數(shù)據(jù)的         
    if(!this.$route.meta.isUseCache){            
        this.list = []; // 清空原有數(shù)據(jù)
        this.onLoad(); // 這是我們獲取數(shù)據(jù)的函數(shù)   
    }
    // 通過這個控制刷新
    this.$route.meta.isUseCache = false;
},

我們加了一行this.$route.meta.isUseCache=false;也就是從detail返回list后炎功,將list的isUseCache字段為false枚冗,而從detail返回list前,我們設(shè)置了list的isUseCache為true蛇损。所以赁温,只有從detail返回list才使用緩存數(shù)據(jù),而其他頁面進入list是重新刷新數(shù)據(jù)的淤齐。
至此股囊,一個前進刷新、后退返回的功能基本完成了更啄。
如果場景再復(fù)雜一丟丟稚疹,比如,如果這個詳情頁是個訂單詳情祭务,那么在訂單詳情頁可能會有刪除訂單的操作内狗。那么刪除訂單操作后會返回訂單列表頁,是需要列表頁重新刷新的义锥。那么我們需要此時在訂單詳情頁進行是否要刷新的判斷柳沙。簡單改造一下詳情頁:

data () {    
    return {
        isDel: false  // 是否進行了刪除訂單的操作       
    }
},
beforeRouteLeave (to, from, next) {        
    if (to.name == 'List') {
        // 根據(jù)是否刪除了訂單的狀態(tài),進行判斷l(xiāng)ist是否需要使用緩存數(shù)據(jù)
        to.meta.isUseCache = !this.isDel;                
    }        
    next();    
},
methods: {        
    deleteOrder () {       
        // 這里是一些刪除訂單的操作

        // 將狀態(tài)變?yōu)橐褎h除訂單
        // 所以beforeRouteLeave鉤子中就會將list組件路由的isUseCache設(shè)置為false    
        // 所以此時再返回list時拌倍,list是會重新刷新數(shù)據(jù)的 
        this.isDel = true; 
        this.$router.go(-1)
    }
}

至此赂鲤,算是解決了我的vue項目中的這個前進刷新噪径、后退緩存數(shù)據(jù)和瀏覽位置的問題。

頁面滾動位置的問題

問題1:

我們知道数初,在vue這種單頁應(yīng)用中找爱,如果你在a頁面滾動了一段距離后,此時前往b頁面后泡孩,b頁面也會停留在a頁面的滾動位置缴允。這個問題的解決,我們可以利用router本身提供的功能來解決:

routes: [    
    {      
        path: '/detail',      
        name: 'Detail',      
        component: resolve => require(['@/pages/detail'], resolve)    
    }    
],
scrollBehavior (to, from, savedPosition) {
    if (savedPosition) {        
          return savedPosition    
    } else {      
          if (from.meta.keepAlive) {        
               from.meta.savedPosition = document.body.scrollTop;      
          }        
          return { x: 0, y: to.meta.savedPosition || 0 }    
    }  
}

scrollBehavior是路由提供的基礎(chǔ)功能珍德,這段函數(shù)寫的是:
1.如果通過瀏覽器自帶的前進后退按鈕切換的路由,那么會自動使用瀏覽默認的回滾上次頁面的瀏覽位置矗漾。
2.如果是通過vue路由進行的頁面切換锈候。例如a前往b,首先判斷a是不是通過keep-alive緩存的組件敞贡,如果是泵琳,則在a路由的meta中添加一個savedPosition字段,并且值為a的滾動位置誊役。最后return的是頁面需要回滾的位置获列。如此一來,如果打開一個頁面蛔垢,該頁面的組件路由中meta.savedPosition為undefined的話击孩,則頁面滾動到(0,0)的位置,這樣解決了問題1鹏漆。那么如果打開一個頁面巩梢,它的路由的meta.savedPosition有值的話,則滾動到上次瀏覽的位置艺玲,因為meta.savedPosition保存的就是上次瀏覽的位置括蝠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饭聚,隨后出現(xiàn)的幾起案子忌警,更是在濱河造成了極大的恐慌,老刑警劉巖秒梳,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件法绵,死亡現(xiàn)場離奇詭異,居然都是意外死亡端幼,警方通過查閱死者的電腦和手機礼烈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婆跑,“玉大人此熬,你說我怎么就攤上這事。” “怎么了犀忱?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵募谎,是天一觀的道長。 經(jīng)常有香客問我阴汇,道長数冬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任搀庶,我火速辦了婚禮拐纱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哥倔。我一直安慰自己秸架,他們只是感情好,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布咆蒿。 她就那樣靜靜地躺著东抹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沃测。 梳的紋絲不亂的頭發(fā)上缭黔,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音蒂破,去河邊找鬼馏谨。 笑死,一個胖子當著我的面吹牛附迷,可吹牛的內(nèi)容都是我干的田巴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼挟秤,長吁一口氣:“原來是場噩夢啊……” “哼壹哺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起艘刚,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤管宵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后攀甚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箩朴,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年秋度,在試婚紗的時候發(fā)現(xiàn)自己被綠了炸庞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡荚斯,死狀恐怖埠居,靈堂內(nèi)的尸體忽然破棺而出查牌,到底是詐尸還是另有隱情,我是刑警寧澤滥壕,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布纸颜,位于F島的核電站,受9級特大地震影響绎橘,放射性物質(zhì)發(fā)生泄漏胁孙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一称鳞、第九天 我趴在偏房一處隱蔽的房頂上張望涮较。 院中可真熱鬧,春花似錦冈止、人聲如沸法希。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毛肋,卻和暖如春怨咪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背润匙。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工诗眨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孕讳。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓匠楚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厂财。 傳聞我的和親對象是個殘疾皇子芋簿,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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