1. 程式人生 > 程式設計 >解決vue單頁面 回退頁面 keeplive 快取問題

解決vue單頁面 回退頁面 keeplive 快取問題

場景:專案中遇到 vue 點選回退 從A頁跳到B頁,快取A頁,當B頁狀態修改再次返回A時,A頁查詢條件快取不重新整理,列表重新整理

A頁:

解決vue單頁面 回退頁面 keeplive 快取問題

B頁:

解決vue單頁面 回退頁面 keeplive 快取問題

解決方法:

利用keep-alive 快取需要快取的頁面

1.在app.vue中改寫router-view

<template>
 <div id="app">
   <keep-alive>
    <router-view v-if="$route.meta.keepAlive">
      <!-- 這裡是會被快取的檢視元件,比如 page1,page2 -->
    </router-view>
  </keep-alive>
  <router-view v-if="!$route.meta.keepAlive">
    <!-- 這裡是不被快取的檢視元件,比如 page3 -->
  </router-view>
 </div>
</template>

2.在router/index.js中新增路由元資訊,設定需要快取的頁面

keepAlive:設定需要快取的頁面

isBack:通過beforeRouteEnter這個鉤子函式中的from引數判斷是從哪個頁面過來的,這個引數執行時,元件例項還沒建立,不能在data中定義變數。所以我們可以在路由中定義一個變數isBack,用來判斷。

{
  path: '/trade',name: 'trade',component: () => import( /* webpackChunkName: "about" */ '@/views/trade.vue'),meta: {
   title:'trade.tradeTitle',keepAlive: true,// 此元件需要被快取
   isBack:false,//用於判斷上一個頁面是哪個
  }
 },{
  path: '/detail/:id',name: 'detail',component: () => import( /* webpackChunkName: "about" */ '@/views/detail.vue'),meta: {
   title:'trade.detailTitle',keepAlive: false,isBack:false,

鉤子函式的執行順序:

不使用keep-alive

beforeRouteEnter --> created --> mounted --> destroyed

使用keep-alive

beforeRouteEnter --> created --> mounted --> activated --> deactivated

再次進入快取的頁面,只會觸發beforeRouteEnter -->activated --> deactivated 。created和mounted不會再執行。我們可以利用不同的鉤子函式,做不同的事。務必理解上述鉤子函式的執行時機和執行順序,本教程的核心就依賴於此鉤子函式

activated和deactivated是使用keep-alive後,vue中比較重要的兩個鉤子函式,建議詳細瞭解下。

在A頁面中通過beforeRouteEnter這個鉤子函式中判斷是從哪個頁面過來的

 beforeRouteLeave(to,from,next) {
 // 路由導航鉤子,此時還不能獲取元件例項 `this`,所以無法在data中定義變數(利用vm除外)
   // 參考 https://router.vuejs.org/zh-cn/advanced/navigation-guards.html
   // 所以,利用路由元資訊中的meta欄位設定變數,方便在各個位置獲取。這就是為什麼在meta中定義isBack
   // 參考 https://router.vuejs.org/zh-cn/advanced/meta.html
  if (from.path === '/detail'){
   //判斷是從哪個路由過來的,
    //如果是B頁面即detail頁面過來的,表明當前頁面不需要重新整理獲取新資料,直接用之前快取的資料即可
   to.meta.isBack = true;
  }else{
   to.meta.isBack = false;
  }
  next();
 },

data中定義變數isFirstEnter用來判斷是否第一次進入,或是否重新整理了頁面,預設false

 data() {
  return {
   isFirstEnter:false,};
 },

created中把isFirstEnter變為true,說明是第一次進入或重新整理了頁面

 created() {
   this.isFirstEnter=true;
   // 只有第一次進入或者重新整理頁面後才會執行此鉤子函式
   // 使用keep-alive後(2+次)進入不會再執行此鉤子函式
   this.$nextTick(() => {
   this.getLists();
  });
 },

activated中增加判斷條件

activated() {
  if(this.$route.meta.isBack || !this.isFirstEnter){
   // 如果isBack是false,表明需要獲取新資料,否則就不再請求,直接使用快取的資料
   // 如果isFirstEnter是true,表明是第一次進入此頁面或使用者重新整理了頁面,需獲取新資料
   this.tradeList=[]
   this.AjaxList = []   //把資料清空,可以稍微避免讓使用者看到之前快取的資料
   this.pageNum = 1;
   this.$nextTick(() => {
    this.getLists();
   });
  }else{
   this.$route.meta.isBack=false
   this.isFirstEnter=false;
  }
},

以上這篇解決vue單頁面 回退頁面 keeplive 快取問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。