vue項目中如何進行登陸控制(爲何要使用to.matched)

1.vue項目當中一般都是經過設置routes配置項來控制路由跳轉,例如設置vue

routes:
[
   {
      path: '/cinema',
      redirect: '/page/cinema',
      component: BlankLayout,
      meta: { title: '影院' , requiresAuth: true}
      children: [
        {
          path: '/cinema/plan',
          name: 'cinemaPlan',
          component: () => import('./views/cinema/Plan'),
          meta: { title: '影院排期' }
        },
        {
          path: '/cinema/cinemaDetail',
          name: 'cinemaDetail',
          component: () => import('./views/cinema/CinemaDetail'),
          meta: { title: '影院詳情' }
        }
       ]
    }
]

利用routes中的meta屬性添加一個字段,用做標識,首先假設在名爲router.js的文件中定義router,具體代碼以下:vue-router

import Vue from  'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

const router  = new VueRouter({ routes })

export router

接着在名爲perssion.js的文件中結合路由守衛,進行登錄驗證,另外這裏若是用戶登陸成功以後,token會默認放在vuex中的getters中,因此在導航守衛中判斷對應getters是否存在,若是存在,證實用戶已登陸,容許用戶進入該路由。不然就跳轉登錄頁,並把當前頁的路由座位query參數傳遞給login頁面:vuex

to.meta && (typeof to.meta.title !== 'undefined' && setDocumentTitle(`${to.meta.title}`))
  if (to.matched.some(record => record.meta.requiresAuth)) {
    // this route requires auth, check if logged in
    // if not, redirect to login page.
    if (!store.getters.token) {
      next({
        path: '/login',
        query: { redirect: to.fullPath }
      })
    } else {
      if (to.query.siteCode) {
        next()
        return
      }
      if (from.query.siteCode) {
        const query = JSON.parse(JSON.stringify(to.query))
        query.siteCode = from.query.siteCode
        next({
          path: to.path,
          query: query
        })
      } else {
        next() // 確保必定要調用 next()
      }
    }
 }

2.主要說明下爲何要使用遍歷to.matched數組判斷meta的requiresAuth字段,而不直接使用to.meta.requiresAuth來判斷,首先例子當中給的是cinema,也便是1級路由設置了requiresAuth.而cinemaPlan沒有設置。假設兩種狀況:數組

 前提:vue路由匹配時會同時匹配知足狀況的全部路由,即若是路由是‘/cinema/plan’的話,‘/cinema’也會觸發。另外若是較高等級的路由須要登陸控制的話,它全部的嵌套路由都是基本須要登陸控制的。ui

(1)cinema具備登陸控制,而cinemaPlan 沒有。若是用戶正常點擊路由跳轉的話,它必然是先進一級路由,再去二級路由,一級路由實現登陸控制,利用to.meta是可以知足的,注意這裏是用戶正常點擊,可是假若有用戶直接改變url地址的話去訪問cinemaPlan的話,則須要給cinemaPlan路由添加requiresAuth字段,同理也須要給cinemaDetail添加字段,若是路由比較多的話,就會很麻煩。this

(2)cinema沒有登陸控制,而cinemaPlan有。這種狀況確實不怕用戶直接改變url訪問二級路由了,可是一樣若是過多二級路由,也是須要設置許多requiresAuth。url

   因此,爲了方便,直接遍歷to.matched數組,該數組中保存着匹配到的全部路由信息。就該例而言,訪問cinema時,matched數組長度爲1,訪問cinemaPlan時,matched數組長度爲2,即保存着‘/cinema’以及‘/cinema/plan’。其實囉嗦了這麼多,直接使用to.meta判斷字段也能夠,就是須要給全部須要控制的路由添加requiresAuth。而to.matched則只須要給較高一級的路由添加requiresAuth便可,其下的全部子路由沒必要添加spa

相關文章
相關標籤/搜索