Vue實(shí)現(xiàn)路由守衛(wèi)的示例代碼
一、概念
路由守衛(wèi)(Navigation Guards)本質(zhì)上就是 在路由跳轉(zhuǎn)前后,攔截用戶導(dǎo)航并做一些邏輯處理的鉤子函數(shù)。
常見(jiàn)用途有:
- 鑒權(quán)控制:比如沒(méi)有登錄就不允許進(jìn)入某些頁(yè)面。
- 數(shù)據(jù)預(yù)加載:在進(jìn)入某個(gè)頁(yè)面前,提前拉取數(shù)據(jù)。
- 頁(yè)面跳轉(zhuǎn)控制:比如離開(kāi)頁(yè)面前彈出“是否保存更改”的提示。
簡(jiǎn)單理解:路由守衛(wèi)就是 Vue Router 提供的一種“鉤子函數(shù)”,用來(lái)控制頁(yè)面導(dǎo)航的行為。
二、類型
Vue Router 提供了三類守衛(wèi):
(1)全局守衛(wèi)
對(duì)所有路由跳轉(zhuǎn)都生效。
// 全局前置守衛(wèi)
router.beforeEach((to, from, next) => {
const token = localStorage.getItem('token')
if (to.meta.requiresAuth && !token) {
// 需要登錄,但沒(méi) token,跳轉(zhuǎn)到登錄
next('/login')
} else {
next()
}
})
// 全局后置守衛(wèi)(一般用來(lái)修改標(biāo)題等)
router.afterEach((to) => {
document.title = to.meta.title || '默認(rèn)標(biāo)題'
})
export default router(2)路由獨(dú)享守衛(wèi)
只針對(duì)某一個(gè)路由生效。
{
path: '/profile',
component: () => import('@/views/Profile.vue'),
beforeEnter: (to, from, next) => {
const token = localStorage.getItem('token')
if (!token) {
next('/login')
} else {
next()
}
}
}(3)組件內(nèi)守衛(wèi)
直接寫(xiě)在組件里,對(duì)進(jìn)入/離開(kāi)當(dāng)前組件生效。
export default {
name: 'Profile',
// 進(jìn)入當(dāng)前組件之前
beforeRouteEnter(to, from, next) {
console.log('即將進(jìn)入 Profile 頁(yè)面')
next()
},
// 路由更新(比如 /profile/1 -> /profile/2)
beforeRouteUpdate(to, from, next) {
console.log('路由參數(shù)變化,更新頁(yè)面數(shù)據(jù)')
next()
},
// 離開(kāi)當(dāng)前組件時(shí)
beforeRouteLeave(to, from, next) {
const answer = window.confirm('確定要離開(kāi)嗎?未保存的數(shù)據(jù)會(huì)丟失')
if (answer) {
next()
} else {
next(false) // 阻止導(dǎo)航
}
}
}三、實(shí)戰(zhàn)
以下為作者的演示:
- 全局守衛(wèi)
- 如果token過(guò)期或token錯(cuò)誤會(huì)返回到登錄頁(yè)面
注意:以上效果需要配合JWT來(lái)實(shí)現(xiàn),詳情請(qǐng)看我的博客文章:
在index.Js文件中寫(xiě)入全局守衛(wèi):
// 全局前置守衛(wèi)
router.beforeEach((to, from, next) => {
const token = localStorage.getItem('token') // 從本地取 token
if (to.meta.requiresAuth && !token) {
// 如果需要登錄且沒(méi)有 token,就跳到登錄頁(yè)
next({ path: '/' })
} else {
next() // 其他情況放行
}
})在request.Js中添加攔截器:
// 響應(yīng)攔截器:統(tǒng)一處理 401
request.interceptors.response.use(
(response) => response,
(error) => {
if (error.response && error.response.status === 401) {
localStorage.removeItem("token"); // 清除過(guò)期 token
router.push("/"); // 跳轉(zhuǎn)到登錄頁(yè)
}
return Promise.reject(error);
}
);可以試驗(yàn)一下,登錄成功進(jìn)入ai頁(yè)面后:

打開(kāi)F12,打開(kāi)本地存儲(chǔ),將token刪除,回到頁(yè)面,并刷新。。

這時(shí)當(dāng)前端發(fā)送的請(qǐng)求頭不帶token令牌時(shí),后端會(huì)返回401,,axois攔截器會(huì)攔截到并且退回登錄頁(yè)面:

到此這篇關(guān)于Vue實(shí)現(xiàn)路由守衛(wèi)的示例代碼的文章就介紹到這了,更多相關(guān)Vue 路由守衛(wèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue通過(guò)axios調(diào)用json地址數(shù)據(jù)的方法
在現(xiàn)代Web開(kāi)發(fā)中,前后端分離已成為標(biāo)準(zhǔn)做法,Vue.js作為前端框架中的佼佼者,提供了豐富的API來(lái)處理數(shù)據(jù)和服務(wù)端的交互,其中一個(gè)常用的庫(kù)是axios,本文將詳細(xì)介紹如何在Vue項(xiàng)目中使用axios來(lái)調(diào)用JSON數(shù)據(jù),需要的朋友可以參考下2024-09-09
Vue.set()實(shí)現(xiàn)數(shù)據(jù)動(dòng)態(tài)響應(yīng)的方法
這篇文章主要介紹了Vue.set()實(shí)現(xiàn)數(shù)據(jù)動(dòng)態(tài)響應(yīng)的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Vue實(shí)現(xiàn)帶參數(shù)的自定義指令示例
這篇文章主要為大家介紹了Vue實(shí)現(xiàn)帶參數(shù)的自定義指令示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
vue.js利用Object.defineProperty實(shí)現(xiàn)雙向綁定
這篇文章主要為大家詳細(xì)介紹了vue.js利用Object.defineProperty實(shí)現(xiàn)雙向綁定,幫大家解析神秘的Object.defineProperty方法2017-03-03
使用 Vue 3 的 createApp方法初始化應(yīng)用的基本步驟
createApp 是 Vue 3 引入的全局 API,用于創(chuàng)建一個(gè)應(yīng)用實(shí)例,這篇文章主要介紹了如何使用 Vue 3 的 createApp方法初始化應(yīng)用,通過(guò) createApp 方法,我們從 Vue 3 的基本初始化開(kāi)始,擴(kuò)展到插件的應(yīng)用、多個(gè)應(yīng)用實(shí)例的創(chuàng)建等,需要的朋友可以參考下2024-05-05
Vue封裝Swiper實(shí)現(xiàn)圖片輪播效果
圖片輪播是前端中經(jīng)常需要實(shí)現(xiàn)的一個(gè)功能。最近學(xué)習(xí)Vue.js,就針對(duì)Swiper進(jìn)行封裝,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖片輪播組件。感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-02-02
基于vue3+antDesign2+echarts?實(shí)現(xiàn)雷達(dá)圖效果
這篇文章主要介紹了基于vue3+antDesign2+echarts?實(shí)現(xiàn)雷達(dá)圖,本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08

