關(guān)于Vue中的全局導(dǎo)航守衛(wèi)(beforeEach、afterEach)
全局導(dǎo)航守衛(wèi)(beforeEach、afterEach)
在項(xiàng)目開(kāi)發(fā)中每一次路由的切換或者頁(yè)面的刷新都需要判斷用戶是否已經(jīng)登錄,前端可以判斷,后端也會(huì)進(jìn)行判斷的,我們前端最好也進(jìn)行判斷。
vue-router 提供了導(dǎo)航鉤子:全局前置導(dǎo)航鉤子 beforeEach 和全局后置導(dǎo)航鉤子 afterEach,他們會(huì)在路由即將改變前和改變后進(jìn)行觸發(fā)。所以判斷用戶是否登錄需要在 beforeEach 導(dǎo)航鉤子中進(jìn)行判斷。
導(dǎo)航鉤子有3個(gè)參數(shù)
1、to:即將要進(jìn)入的目標(biāo)路由對(duì)象;
2、from:當(dāng)前導(dǎo)航即將要離開(kāi)的路由對(duì)象;
3、next :調(diào)用該方法后,才能進(jìn)入下一個(gè)鉤子函數(shù)(afterEach)。
next()//直接進(jìn)to 所指路由
next(false) //中斷當(dāng)前路由
next('route') //跳轉(zhuǎn)指定路由
next('error') //跳轉(zhuǎn)錯(cuò)誤路由beforeEach
實(shí)現(xiàn)用戶驗(yàn)證的代碼:
router.beforeEach((to, from, next) => {
? ? ? //我在這里模仿了一個(gè)獲取用戶信息的方法
? ?let isLogin = window.sessionStorage.getItem('userInfo');
? ? ? if (isLogin) {
? ? ? ? ? //如果用戶信息存在則往下執(zhí)行。
? ? ? ? ? next()
? ? ? } else {
? ? ? ? ? //如果用戶token不存在則跳轉(zhuǎn)到login頁(yè)面
? ? ? ? ? if (to.path === '/login') {
? ? ? ? ? ? ?next()
? ? ? ? ?} else {
? ? ? ? ? ? ?next('/login')
? ? ? ? ?}
? ? ?}?
?})afterEach
和 beforeEach 不同的是 afterEach 不接收第三個(gè)參數(shù) next 函數(shù),也不會(huì)改變導(dǎo)航本身,一般 beforeEach 用的最多,afterEach 用的少
router.afterEach((to,from)=>{ //這里不接收next
? ? console.log(to);
? ? console.log(from);
})全局導(dǎo)航守衛(wèi)是干什么的?
應(yīng)用場(chǎng)景: 登錄頁(yè)面防止用戶頁(yè)面直接在地址欄中可以訪問(wèn)其他頁(yè)面;

背景: 在 地址欄當(dāng)中輸入地址可以訪問(wèn)其他頁(yè)面;然而我們需要一個(gè)系統(tǒng)當(dāng)中來(lái)進(jìn)行攔截;
那就是全局導(dǎo)航守衛(wèi)來(lái)進(jìn)行攔截, 用vue-Router 實(shí)例的方法來(lái)實(shí)現(xiàn)的;
1.在router中的index.js文件里引入vue-router
import Router from 'vue-router' Vue.use(Router)
2.創(chuàng)建路由實(shí)例
const router = new Router({
routes: [
{ path: '/', redirect: '/login' },
{ path: '/login', component: Login },
{ path: '/home', component: Home}
]
})3.掛載全局導(dǎo)航守衛(wèi)
//全局路由前置守衛(wèi) --路由攔截
router.beforeEach((to, from, next) => {
// to 將要前往的路由
//from 從哪個(gè)路由過(guò)來(lái)的
//next(path) 是一個(gè)函數(shù) 表示繼續(xù)執(zhí)行下一步,強(qiáng)制執(zhí)行前往的path 路由
//如果前往login 頁(yè)面 則不需要token 直接進(jìn)入就可以
if (to.path === "/login") return next();
//獲取token
const TOKEN = window.sessionStorage.getItem("TOKEN");
if (!TOKEN) {
//token 不存在 name 意味著 沒(méi)有進(jìn)行登錄 返回登錄頁(yè)面
next({ path: "/login" });
}
//已經(jīng) 存在TOKEN name 就可以進(jìn)行
next();
});以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決vue單頁(yè)面應(yīng)用打包后相對(duì)路徑、絕對(duì)路徑相關(guān)問(wèn)題
這篇文章主要介紹了解決vue單頁(yè)面應(yīng)用打包后相對(duì)路徑、絕對(duì)路徑相關(guān)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
vue實(shí)現(xiàn)四級(jí)導(dǎo)航及驗(yàn)證碼的方法實(shí)例
我們?cè)谧鲰?xiàng)目經(jīng)常會(huì)遇到多級(jí)導(dǎo)航這個(gè)需求,所以下面這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)四級(jí)導(dǎo)航及驗(yàn)證碼的相關(guān)資料,文章通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07
vue下axios攔截器token刷新機(jī)制的實(shí)例代碼
這篇文章主要介紹了vue下axios攔截器token刷新機(jī)制的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
vue2移動(dòng)端使用vue-qrcode-reader實(shí)現(xiàn)掃一掃功能的步驟
最近在使用vue開(kāi)發(fā)的h5移動(dòng)端想要實(shí)現(xiàn)一個(gè)調(diào)用攝像頭掃描二維碼的功能,所以下面這篇文章主要給大家介紹了關(guān)于vue2移動(dòng)端使用vue-qrcode-reader實(shí)現(xiàn)掃一掃功能的相關(guān)資料,需要的朋友可以參考下2023-06-06
vue+elementUI多表單同時(shí)提交及表單校驗(yàn)最新解決方案
假設(shè)有一個(gè)頁(yè)面,需要分三步填寫(xiě)三個(gè)表單,且每個(gè)表單位于獨(dú)立的組件中,然后最后保存同時(shí)提交,如何進(jìn)行表單必填項(xiàng)校驗(yàn),下面小編給大家介紹vue+elementUI多表單同時(shí)提交及表單校驗(yàn)最新解決方案,感興趣的朋友一起看看吧2024-03-03
淺談Vue數(shù)據(jù)響應(yīng)思路之?dāng)?shù)組
這篇文章主要介紹了淺談Vue數(shù)據(jù)響應(yīng)思路之?dāng)?shù)組,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Vue render函數(shù)實(shí)戰(zhàn)之實(shí)現(xiàn)tabs選項(xiàng)卡組件
這篇文章主要介紹了Vue render函數(shù)實(shí)戰(zhàn)之實(shí)現(xiàn)tabs選項(xiàng)卡組件的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
vue3 選中對(duì)話框時(shí)對(duì)話框右側(cè)出一個(gè)箭頭效果
本文主要介紹了Vue3實(shí)現(xiàn)選中對(duì)話框帶箭頭效果的方法,首先通過(guò)后臺(tái)獲取數(shù)據(jù)進(jìn)行遍歷,利用ts代碼判斷選中下標(biāo)與循環(huán)游標(biāo)是否一致以改變樣式,感興趣的朋友一起看看吧2024-10-10

