Vue router 全局路由守衛

  記錄一下全局路由守衛的使用;vue

  方法一:定義一個數組用於檢測與管理須要登陸的頁面,全局路由守衛配合本地存儲判斷是否跳轉vue-router

import Vue from 'vue'
import Router from 'vue-router'
import store from './../store'

import Home from 'components/home/home' // 主頁組件

// 其它組件...

import Cart from 'components/cart/cart' // 購物車組件
import User from 'components/user/user' // 用戶中心組件

// 其餘組件...

import GoodsDetail from 'components/goods-detail/goods-detail' // 商品詳情組件

import { localTake } from 'common/js/localStore' // 本地存儲方法封裝

Vue.use(Router)

const router = new Router({
  routes: [
    {
      path: '/', // 默認地址
      redirect: '/home'
    },
    {
      path: '/home',
      component: Home,
      name: 'Home',
      meta: {
        title: '主頁',
        keepAlive: true // 須要被緩存
      }
    },
    {
      path: '/cart',
      component: Cart,
      name: 'Cart',
      meta: {
        title: '購物車',
        keepAlive: true // 須要被緩存
      }
    },
    {
      path: '/user',
      component: User,
      name: 'User',
      meta: {
        title: '個人',
        keepAlive: true // 須要被緩存
      }
    },
    {
      path: '/user-login',
      component: UserLogIn,
      name: 'UserLogIn',
      meta: {
        title: '登陸',
        keepAlive: false // 不須要被緩存
      }
    },
    {
      path: '/goods-detail',
      component: GoodsDetail,
      name: 'GoodsDetail',
      meta: {
        title: '商品詳情',
        keepAlive: true // 須要被緩存
      }
    }
  ],
  scrollBehavior (to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return {x: 0, y: 0}
    }
  }
})

// 全局路由守衛
router.beforeEach((to, from, next) => {
  const nextRoute = ['User', 'Cart', 'GoodsDetail'] // 須要登陸的頁面
  let isLogin = localTake('userMsg')  // 判斷是否登陸,本地存儲有用戶數據則視爲已經登陸
  // 未登陸狀態;當路由到 nextRoute 指定頁時,跳轉至 UserLogIn
  if (nextRoute.indexOf(to.name) >= 0) { // 檢測是否登陸的頁面
    if (!isLogin) { // 若是未登陸(本地存儲無用戶數據),而且要跳到登陸頁面
      if (from.name === 'UserLogIn') {
        next('/')
        return
      }
    // 登陸後,跳到到當前頁面
      router.push({
        name: 'UserLogIn',
        params: {redirect: to.fullPath}  
      })
    }
  }
  // 已登陸狀態;當路由到 UserLogIn 時,跳轉至 Home
  if (to.name === 'UserLogIn') {
    if (isLogin) {
      next('/')
      return
    }
  }
  next() // 必須使用 next ,執行效果依賴 next 方法的調用參數
})

export default router

 

  方法二:經過定義to.meta.needLogin(needLogin 爲自定義,路由元信息),判斷是否須要登陸數組

import Vue from 'vue'
import Router from 'vue-router'
import store from './../store'

import Home from 'components/home/home' // 主頁組件

// 其它組件...

import Cart from 'components/cart/cart' // 購物車組件
import User from 'components/user/user' // 用戶中心組件

// 其餘組件...

import GoodsDetail from 'components/goods-detail/goods-detail' // 商品詳情組件

import { localTake } from 'common/js/localStore' // 本地存儲方法封裝

Vue.use(Router)
const router = new Router({
  routes: [
    {
      path: '/', // 默認地址
      redirect: '/home'
    },
    {
      path: '/home',
      component: Home,
      name: 'Home',
      meta: {
        title: '主頁',
        keepAlive: true // 須要被緩存
      }
    },
    {
      path: '/cart',
      component: Cart,
      name: 'Cart',
      meta: {
        title: '購物車',
        keepAlive: true, // 須要被緩存
        needLogin: true // 須要登陸 
      }
    },
    {
      path: '/user',
      component: User,
      name: 'User',
      meta: {
        title: '個人',
        keepAlive: true, // 須要被緩存
        needLogin: true // 須要登陸
      }
    },
    {
      path: '/user-login',
      component: UserLogIn,
      name: 'UserLogIn',
      meta: {
        title: '登陸',
        keepAlive: false // 不須要被緩存
      }
    },
    {
      path: '/goods-detail',
      component: GoodsDetail,
      name: 'GoodsDetail',
      meta: {
        title: '商品詳情',
        keepAlive: true, // 須要被緩存
        needLogin: true // 須要登陸
      }
    }
  ]
})
// 全局路由守衛
router.beforeEach((to, from, next) => {
  let isLogin = localTake('userMsg') 
  if (to.meta.needLogin) {  // 判斷該路由是否須要登陸權限
    if (isLogin) { // 判斷是否已經登陸
      next()
    }
    else {
      next({
        path: '/login',
        query: {redirect: to.fullPath}  // 將跳轉的路由path做爲參數,登陸成功後跳轉到該路由
      })
    }
  }
  else {
    next()
  }
})


export default router

 

推薦使用判斷路由元信息的方法,代碼比較簡潔,能更好的維護與管理緩存

相關文章
相關標籤/搜索