vue-router路由元信息及keep-alive組件級緩存

  路由元信息?(黑人問號臉???)是不是這麼官方的解釋很多人都會一臉懵?那麼我們說meta,是不是很多人恍然大悟,因爲在項目中用到或者看到過呢?

  是的,路由元信息就是我們定義路由時配置的meta字段;那麼這個meta的作用是什麼呢?

  首先看一個場景:

    通常我們在開發網站或者移動應用的時候,我們通常會有網頁權限驗證的需求(別說你沒有,你肯定有),這種需求一般是指需要登錄後纔可進入,也就是需要用戶登錄獲取用戶Token或者用戶信息之後纔可進入;當這個需求下來的時候,我們作爲前端開發人員的第一反應是路由守衛啊,一個路由前置守衛通過判斷to.path就可以解決;

    用to.path來判斷做權限驗證會有兩個問題:    

    1:首先,如果需要做權限驗證的頁面很多呢?難道我們要通過if(to.path==='/' || to.path === '/home')這種方式來一個個的添加路徑判斷嗎?

    2:然後,routes管理器中會有很多json對象,這種json對象我們通常把它叫做路由記錄,路由記錄是可以嵌套的,允許存在父子關係;我們用if來判斷的時候,會有匹配不完全的問題,例如你匹配了/home,那麼/home/list呢,這個將不會被匹配到;

    我們的理想狀態下是假如我要限制了/home,那麼不管你路徑是/home/index也好還是/home/home也好,只要是home下來的子路由記錄統統都需要登錄後才能訪問;

    這個時候我們就可以考慮用路由元信息meta來進行處理;

    首先簡單的看一下頁面效果:

   我們的路由管理器中的路由記錄配置如下:

const routes=[
    {
        path:'/page1',
        component:page1,
        meta:{
            login:true
        },
        children: [
            {
                path: "phone",
                component: phone
            },
            {
                path: "computer",
                component: computer
            },
        ]
    },

    {
        path:"/page2",
        component:page2,
        meta:{
            login:false
        }
    },
]

  我們上面在meta中自定義login字段是標識當前路由是否需要驗證token;

  然後我們的路由前置全局守衛可以這麼寫:

  

router.beforeEach((to, from, next) => {
   //定義token來模擬
    let token =“123456”
   //判斷即將進入的路由是否需要驗證
   if(to.meta.login){
     //如果即將進入的路由需要驗證
    //並且token不存在的話,那麼就跳轉page2(登錄頁)
       if(!token){
           next("/page2");
      //如果需求驗證token存在直接放行
       }else{
           next();
       }
    //如果不需要驗證也是直接放行
   }else{
    next();
   }
})

  最後效果圖如下:

  當然這只是路由元信息的功能其一,路由元信息其實有很多用途,類似於一個當前路由的全局變量,可以通過meta來進行判斷操作;

 

  keep-alive組件:

    場景:在一個列表項很長的時候我們通常需要進行分頁操作,移動端的分頁操作基本上是上拉加載和下拉刷新;假如我們已經進入了這個列表的第四頁,那麼當我們想進去詳情頁查看詳情的時候,當我們返回的時候這個時候頁碼會直接變爲1,因爲數據已經初始化狀態;這個問題我們通常需要keep-alive組件來解決;

     keep-alive是Vue內置的一個組件,通常是用來保留數據狀態或避免重複渲染,也就是我們說的緩存效果;

   使用:

<keep-alive>
  <component>
    <!-- 該組件將被緩存! -->
  </component>
</keep-alive>

     keep-alive給我們提供了兩個屬性,分別是include和exclude:

    include:接受值爲字符串或者正則表達式,只有匹配的才被緩存;

    exclude:接受值爲字符串或者正則表達式,被匹配的路由將不會被緩存;

// 組件 a
export default {
  name: 'a',
  data () {
    return {}
  }
}
 
<keep-alive include="a">
  <component>
    <!-- name 爲 a 的組件將被緩存! -->
  </component>
</keep-alive>可以保留它的狀態或避免重新渲染
<keep-alive exclude="a">
  <component>
    <!-- 除了 name 爲 a 的組件都將被緩存! -->
  </component>
</keep-alive>可以保留它的狀態或避免重新渲染

當然我們也可以根據組件來動態緩存,我們知道vue-router是Vue官方給我們提供的一個路由組件:

<keep-alive>
    <router-view>
        <!-- 所有路徑匹配到的視圖組件都會被緩存! -->
    </router-view>
</keep-alive>

  如果像上述代碼這樣,我們的所有路由視圖都將被緩存,我們這個時候就可以藉助我們的路由元信息meta,那麼我們來修改一下代碼實現動態緩存:

  思路:

    meta路由元信息對象裏面放着的是類似於局部變量,在路由匹配的組件內部都能夠訪問得到,我們可以通過meta來定義一個自定義字段來判斷標識頁面是否需要開啓緩存:

    

// routes 配置
export default [
  {
    path: '/',
    name: 'home',
    component: Home,
    meta: {
      keepAlive: true // 需要被緩存
    }
  }, {
    path: '/:id',
    name: 'edit',
    component: Edit,
    meta: {
      keepAlive: false // 不需要被緩存
    }
  }
]
 
 //通過v-if來動態的判斷展示
<keep-alive>
    <router-view v-if="$route.meta.keepAlive">
        <!-- 這裏是會被緩存的視圖組件,比如 Home! -->
    </router-view>
</keep-alive>

<router-view v-if="!$route.meta.keepAlive">
    <!-- 這裏是不被緩存的視圖組件,比如 Edit! -->
</router-view>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章