1. 程式人生 > 實用技巧 >vue 利用keep-alive進行緩衝 注意事項

vue 利用keep-alive進行緩衝 注意事項

1、對於一層跳轉,例如 A(列表頁面) ->進入 B(詳情頁面) ->再到 A(列表頁面),建議用一下方式:

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

2、對於多層跳轉,比如,一個列表頁(a)、詳情頁(b)和詳情擴充套件頁(c),a -> b頁面,a是快取頁,b需要在每次開啟時,重新渲染;

b -> c頁面,此時b需要被快取,從c返回時,需要b保持不變。建議用一下方式:

<keep-alive :include="['A','B']">
     <router-view></router-view>
</keep-alive>

對於第二種方法官方提供三個屬性:

  • include- 字串或正則表示式。只有名稱匹配的元件會被快取。
  • exclude- 字串或正則表示式。任何名稱匹配的元件都不會被快取。
  • max- 數字。最多可以快取多少元件例項。
<!-- 逗號分隔字串 -->
<keep-alive include="
a,b"> <component :is="view"></component> </keep-alive> <!-- 正則表示式 (使用 `v-bind`) --> <keep-alive :include="/a|b/"> <component :is="view"></component> </keep-alive> <!-- 陣列 (使用 `v-bind`) --> <keep-alive :include="['a', 'b']"> <component :is
="view"></component> </keep-alive>

此處需要注意:

  1、第二種方法需要路由入口必須唯一(即:頁面當中只有一個<router-view></router-view>),否則緩衝無效(路由都被緩衝)

  2、:include="['A', 'B']"其中 A B 代表路由的name值

  3、不管第一種還是第二種方法一旦利用$destory銷燬當前元件,則該元件將不被緩衝

以上兩種用法根據不同需求進行選擇,利用第二種方式一定要注意路由入口唯一問題,還有就是第二種方式更合適和vuex配合

以下是自己在專案中的做法,由於當時搭建的適合用了兩個<router-view></router-view>,所以放棄了第二種方法,但是屬於多層跳轉
A表示類別頁面
B表示詳情頁面
C表示詳情拓展頁面

需求:A進入B(不緩衝),B進入C(不緩衝),C進入B(有修改不緩衝,反之修改),B進入A(有修改不緩衝(此處的修改可能發生在C裡面),反之修改)

A元件程式碼:

beforeRouteEnter(to, from, next){
   to.meta.keepAlive = true;
   next(vm => {
       if (from.path.indexOf("projectDetail") < 0 && from.path != "/" && from.path != "/login") {
            //自己邏輯程式碼
             vm.status = 0;
             vm.getProjectList();
       } 
        if (from.path.indexOf("projectDetail") > -1 && sessionStorage.getItem("reload") == "true") {
           //自己邏輯程式碼
            vm.status = 0;
            vm.getProjectList();
        }
   })
}    

此處判斷 ‘/’ 防止在當前頁面重新整理,判斷 ‘/login’防止當登陸介面呼叫兩次

判斷 sessionStorage.getItem("reload") 記錄一個全域性狀態,判斷B進入A(有修改不緩衝(此處的修改可能發生在C裡面),反之修改)

B元件程式碼:

beforeRouteEnter(to, from, next){
    to.meta.keepAlive = true;
    next(vm => {
      if (from.path.indexOf("projectList") > -1 || from.path == "/") {
            //自己邏輯程式碼
            vm.status = 1;
            vm.catalogIndex = "0-0";
            vm.getProjectDetail();
       }
        //這裡把頁面初始值重新賦值,以重新整理頁面(C進入B)
        //狀態C裡面記錄
       if(vm.$route.meta.isBuffer){
            //自己邏輯程式碼
             sessionStorage.setItem("reload", true);  //重新整理專案列表
             vm.$route.meta.isBuffer = false;         //恢復初始值
             vm.status = 1;
             vm.catalogIndex = "0-0";
             vm.getProjectDetail();
        }
   })
}        

此處判斷 ‘/’ 防止在當前頁面重新整理,判斷 ‘/login’防止當登陸介面呼叫兩次

C元件程式碼:

beforeRouteLeave (to, from, next) {
    if (to.path.indexOf("projectDetail") > -1 && to.query.id && this.isBuffer) {
           //自己邏輯程式碼
            to.meta.keepAlive = false;
            to.meta.isBuffer = true;   
     }
     next()
 }

this.isBuffer表示修改狀態預設false,有修改則改為true,用於重新整理B元件

以上僅共參考,可能有不對的地方,希望指出