vue路由守衛(wèi)及路由守衛(wèi)無(wú)限循環(huán)問(wèn)題詳析
先貼一波官方文檔的內(nèi)容
const router = new VueRouter({ ... }) router.beforeEach((to, from, next) => { // ... })
當(dāng)一個(gè)導(dǎo)航觸發(fā)時(shí),全局前置守衛(wèi)按照創(chuàng)建順序調(diào)用。守衛(wèi)是異步解析執(zhí)行,此時(shí)導(dǎo)航在所有守衛(wèi) resolve 完之前一直處于 等待中。
每個(gè)守衛(wèi)方法接收三個(gè)參數(shù):
- to: Route: 即將要進(jìn)入的目標(biāo) 路由對(duì)象
- from: Route: 當(dāng)前導(dǎo)航正要離開的路由
- next: Function: 一定要調(diào)用該方法來(lái) resolve 這個(gè)鉤子。執(zhí)行效果依賴 next 方法的調(diào)用參數(shù)。
- next(): 進(jìn)行管道中的下一個(gè)鉤子。如果全部鉤子執(zhí)行完了,則導(dǎo)航的狀態(tài)就是 confirmed (確認(rèn)的)。
- next(false): 中斷當(dāng)前的導(dǎo)航。如果瀏覽器的 URL 改變了 (可能是用戶手動(dòng)或者瀏覽器后退按鈕),那么 URL 地址會(huì)重置到 from 路由對(duì)應(yīng)的地址。
- next('/') 或者 next({ path: '/' }): 跳轉(zhuǎn)到一個(gè)不同的地址。當(dāng)前的導(dǎo)航被中斷,然后進(jìn)行一個(gè)新的導(dǎo)航。你可以向 next 傳遞任意位置對(duì)象,且允許設(shè)置諸如 replace: true、name: 'home' 之類的選項(xiàng)以及任何用在 router-link 的 to prop 或 router.push 中的選項(xiàng)。
- next(error): (2.4.0+) 如果傳入 next 的參數(shù)是一個(gè) Error 實(shí)例,則導(dǎo)航會(huì)被終止且該錯(cuò)誤會(huì)被傳遞給 router.onError() 注冊(cè)過(guò)的回調(diào)。確保要調(diào)用 next 方法,否則鉤子就不會(huì)被 resolved
然后這是我自己的總結(jié)
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) => { //將所有需要登陸才顯示的頁(yè)面的路由都放進(jìn)一個(gè)數(shù)組 const nextRoute = ['index', 'library', 'design', 'administration', 'production']; //獲取登陸狀態(tài) let isLogin = Global.isLogin if(to.name === 'login') { //如果是登錄頁(yè),則跳過(guò)驗(yàn)證 next() //必不可少 return //以下的代碼不執(zhí)行 } if(nextRoute.indexOf(to.name) >= 0) { //判斷該頁(yè)面是否需要登陸 if(!isLogin) { //判斷登陸狀態(tài) next({ name : 'login'}) //如果未登錄,則跳轉(zhuǎn)到登錄頁(yè) } else { next() //如果已經(jīng)登陸,那就可以跳轉(zhuǎn) } } else { //其他的無(wú)需登陸的頁(yè)面不做驗(yàn)證 next() } }) export default router
這樣就實(shí)現(xiàn)了全局路由守衛(wèi)
關(guān)于路由守衛(wèi)無(wú)限循環(huán)問(wèn)題
如果你的代碼是這樣
if(isLogin) { next() } else { next({ name: 'login')} }
這樣的話就會(huì)陷入無(wú)限循環(huán)
因?yàn)槟愕?nbsp; next({ name: 'login')} 是相當(dāng)于一個(gè)路由跳轉(zhuǎn),它會(huì)再次觸發(fā)全局路由守衛(wèi),你又進(jìn)入了全局路由守衛(wèi)進(jìn)行再次判斷,如此循環(huán)。
所以,想要結(jié)束路由守衛(wèi),整段代碼的邏輯必須由 next() 進(jìn)行結(jié)尾。比如像我上面寫的,當(dāng)需要進(jìn)入登錄頁(yè)的時(shí)候,
if(to.name === 'login') { next() return }
加上這個(gè)判斷,當(dāng)你進(jìn)入登錄頁(yè)的時(shí)候也會(huì)調(diào)用next() , 路由守衛(wèi)進(jìn)入確認(rèn)狀態(tài),路由才會(huì)進(jìn)行跳轉(zhuǎn)
以上就是我在學(xué)習(xí)vue-router的路由守衛(wèi)的總結(jié)
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
詳解如何實(shí)現(xiàn)在Vue中導(dǎo)入Excel文件
這篇文章主要介紹了如何在Vue中導(dǎo)入Excel文件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-01-01vue使用Split封裝通用拖拽滑動(dòng)分隔面板組件
這篇文章主要介紹了vue使用Split封裝通用拖拽滑動(dòng)分隔面板組件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03vue.js父子組件傳參的原理與實(shí)現(xiàn)方法
這篇文章主要介紹了vue.js父子組件傳參的原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了vue.js父子組件傳參的基本原理、實(shí)現(xiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2023-04-04解析Vue2 dist 目錄下各個(gè)文件的區(qū)別
本篇文章主要介紹了解析Vue2 dist 目錄下各個(gè)文件的區(qū)別,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Vue路由鉤子之a(chǎn)fterEach beforeEach的區(qū)別詳解
這篇文章主要介紹了Vue路由鉤子 afterEach beforeEach區(qū)別 ,vue-router作為vue里面最基礎(chǔ)的服務(wù),學(xué)習(xí)一段時(shí)間,對(duì)遇到的需求進(jìn)行一些總結(jié)。需要的朋友可以參考下2018-07-07vue實(shí)現(xiàn)彈框遮罩點(diǎn)擊其他區(qū)域彈框關(guān)閉及v-if與v-show的區(qū)別介紹
vue如何簡(jiǎn)單的實(shí)現(xiàn)彈框,遮罩,點(diǎn)擊其他區(qū)域關(guān)閉彈框, 簡(jiǎn)單的思路是以一個(gè)div作為遮罩,這篇文章給大家詳細(xì)介紹了vue實(shí)現(xiàn)彈框遮罩點(diǎn)擊其他區(qū)域彈框關(guān)閉及v-if與v-show的區(qū)別介紹,感興趣的朋友一起看看吧2018-09-09Vue項(xiàng)目中ESlint規(guī)范示例代碼
這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目中ESlint規(guī)范的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07