先貼一波官方文檔的內容
const router = new VueRouter({ ... })router.beforeEach((to, from, next) => { // ...})當一個導航觸發時,全局前置守衛按照創建順序調用。守衛是異步解析執行,此時導航在所有守衛 resolve 完之前一直處于 等待中。
每個守衛方法接收三個參數:
然后這是我自己的總結
import Vue from 'vue'import Router from 'vue-router'import Login from '@/pages/login/Login'import Index from '../pages/index/Index'import Library from '../pages/library/Library'import Design from '../pages/design/Design'import Administration from '../pages/administration/Administration'import Production from '../pages/production/Production'import Global from '../common/global/Global'Vue.use(Router)const router = new Router({ routes: [ { path: '/', name: 'login', component: Login }, { path: '/index', name: 'index', component: Index }, { path: '/library', name: 'library', component: Library }, { path: '/design', name: 'design', component: Design }, { path: '/administration', name: 'administration', component: Administration }, { path: '/production', name: 'production', component: Production } ]})router.beforeEach ((to,from,next) => { //將所有需要登陸才顯示的頁面的路由都放進一個數組 const nextRoute = ['index', 'library', 'design', 'administration', 'production']; //獲取登陸狀態 let isLogin = Global.isLogin if(to.name === 'login') { //如果是登錄頁,則跳過驗證 next() //必不可少 return //以下的代碼不執行 } if(nextRoute.indexOf(to.name) >= 0) { //判斷該頁面是否需要登陸 if(!isLogin) { //判斷登陸狀態 next({ name : 'login'}) //如果未登錄,則跳轉到登錄頁 } else { next() //如果已經登陸,那就可以跳轉 } } else { //其他的無需登陸的頁面不做驗證 next() } })export default router這樣就實現了全局路由守衛
關于路由守衛無限循環問題
如果你的代碼是這樣
if(isLogin) { next() } else { next({ name: 'login')} }這樣的話就會陷入無限循環
因為你的 next({ name: 'login')} 是相當于一個路由跳轉,它會再次觸發全局路由守衛,你又進入了全局路由守衛進行再次判斷,如此循環。
所以,想要結束路由守衛,整段代碼的邏輯必須由 next() 進行結尾。比如像我上面寫的,當需要進入登錄頁的時候,
if(to.name === 'login') { next() return }加上這個判斷,當你進入登錄頁的時候也會調用next() , 路由守衛進入確認狀態,路由才會進行跳轉
以上就是我在學習vue-router的路由守衛的總結
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。
新聞熱點
疑難解答