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

打開F12,打開本地存儲,將token刪除,回到頁面,并刷新。。

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

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

