Vue3+TS實(shí)現(xiàn)動(dòng)態(tài)路由權(quán)限的示例詳解
當(dāng)我們?cè)陂_(kāi)發(fā)一個(gè)大型的前端應(yīng)用時(shí),動(dòng)態(tài)路由權(quán)限是一個(gè)必不可少的功能。本文將介紹如何使用Vue 3和TypeScript來(lái)實(shí)現(xiàn)動(dòng)態(tài)路由權(quán)限,并且保持性能最佳。
1. 前置知識(shí)
在開(kāi)始之前,你需要對(duì)以下知識(shí)有基本的了解:
- Vue 3
- TypeScript
- Vue Router
2. 實(shí)現(xiàn)思路
動(dòng)態(tài)路由權(quán)限的實(shí)現(xiàn)思路可以分為以下幾個(gè)步驟:
- 創(chuàng)建一個(gè)路由守衛(wèi),在進(jìn)入路由之前判斷該路由是否需要進(jìn)行權(quán)限驗(yàn)證。
- 在路由配置中添加
meta
字段來(lái)標(biāo)記該路由需要進(jìn)行權(quán)限驗(yàn)證,以及該路由所需的權(quán)限信息。 - 創(chuàng)建一個(gè)權(quán)限驗(yàn)證函數(shù),根據(jù)當(dāng)前用戶的角色和路由的權(quán)限信息來(lái)判斷是否有權(quán)限訪問(wèn)該路由。
- 在權(quán)限驗(yàn)證函數(shù)中調(diào)用后端API獲取當(dāng)前用戶的角色信息,并將該信息保存到Vuex狀態(tài)管理中。
- 在路由守衛(wèi)中調(diào)用權(quán)限驗(yàn)證函數(shù),并根據(jù)驗(yàn)證結(jié)果進(jìn)行相應(yīng)的操作,例如跳轉(zhuǎn)到登錄頁(yè)或顯示無(wú)權(quán)訪問(wèn)提示。
3. 具體實(shí)現(xiàn)
下面將具體介紹如何使用Vue 3和TypeScript來(lái)實(shí)現(xiàn)動(dòng)態(tài)路由權(quán)限。
3.1 創(chuàng)建路由守衛(wèi)
首先,我們需要?jiǎng)?chuàng)建一個(gè)全局路由守衛(wèi)來(lái)判斷該路由是否需要進(jìn)行權(quán)限驗(yàn)證。在router/index.ts
中添加以下代碼:
import { router } from './index'; import store from '../store'; router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresAuth)) { const hasToken = store.getters['auth/hasToken']; if (!hasToken) { // 跳轉(zhuǎn)到登錄頁(yè) next('/login'); return; } const requiredRoles = to.meta.roles; const userRole = store.getters['user/role']; if (!requiredRoles.includes(userRole)) { // 顯示無(wú)權(quán)訪問(wèn)提示 next('/403'); return; } } next(); });
在上面的代碼中,我們首先判斷該路由是否需要進(jìn)行權(quán)限驗(yàn)證,如果需要,則判斷當(dāng)前用戶是否有token,如果沒(méi)有則跳轉(zhuǎn)到登錄頁(yè);然后根據(jù)當(dāng)前用戶的角色和路由所需的權(quán)限信息來(lái)判斷是否有權(quán)限訪問(wèn)該路由,如果沒(méi)有則顯示無(wú)權(quán)訪問(wèn)提示。
3.2 添加路由元信息
接下來(lái),在路由配置中添加meta
字段來(lái)標(biāo)記該路由需要進(jìn)行權(quán)限驗(yàn)證,以及該路由所需的權(quán)限信息。在router/index.ts
中添加以下代碼:
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'; const routes: RouteRecordRaw[] = [ { path: '/login', name: 'Login', component: () => import('../views/Login.vue'), }, { path: '/', name: 'Home', component: () => import('../views/Home.vue'), meta: { requiresAuth: true, roles: ['admin', 'editor'], }, }, { path: '/about', name: 'About', component: () => import('../views/About.vue'), meta: { requiresAuth: true, roles: ['admin'], }, }, // ... ]; export const router = createRouter({ history: createWebHistory(), routes, });
在上面的代碼中,我們?cè)诼酚膳渲弥刑砑恿?code>meta字段來(lái)定義該路由需要進(jìn)行權(quán)限驗(yàn)證,以及該路由所需的權(quán)限信息。
3.3 創(chuàng)建權(quán)限驗(yàn)證函數(shù)
接下來(lái),我們需要?jiǎng)?chuàng)建一個(gè)權(quán)限驗(yàn)證函數(shù)來(lái)判斷當(dāng)前用戶是否有權(quán)限訪問(wèn)該路由。在store/modules/user.ts
中添加以下代碼:
import { Module } from 'vuex'; import { RootState } from '../index'; interface UserState { id: number; role: string; } const userModule: Module<UserState, RootState> = { namespaced: true, state: { id: 0, role: '', }, getters: { role(state): string { return state.role; }, }, mutations: { setId(state, id: number) { state.id = id; }, setRole(state, role: string) { state.role = role; }, }, actions: { async fetchUser({ commit }) { // 調(diào)用后端API獲取當(dāng)前用戶的角色信息 const response = await fetch('/api/user'); const data = await response.json(); commit('setId', data.id); commit('setRole', data.role); }, }, }; export default userModule; export type { UserState };
在上面的代碼中,我們首先定義了一個(gè)UserState
接口來(lái)描述用戶狀態(tài);然后在userModule
中定義了一個(gè)fetchUser
異步action來(lái)調(diào)用后端API獲取當(dāng)前用戶的角色信息,并將該信息保存到Vuex狀態(tài)管理中。
3.4 調(diào)用權(quán)限驗(yàn)證函數(shù)
最后,在路由守衛(wèi)中調(diào)用權(quán)限驗(yàn)證函數(shù),并根據(jù)驗(yàn)證結(jié)果進(jìn)行相應(yīng)的操作。在router/index.ts
中添加以下代碼:
import { router } from './index'; import store from '../store'; router.beforeEach(async (to, from, next) => { if (to.matched.some(record => record.meta.requiresAuth)) { const hasToken = store.getters['auth/hasToken']; if (!hasToken) { // 跳轉(zhuǎn)到登錄頁(yè) next('/login'); return; } const requiredRoles = to.meta.roles; const userRole = store.getters['user/role']; if (!userRole) { // 獲取當(dāng)前用戶的角色信息 await store.dispatch('user/fetchUser'); } if (!requiredRoles.includes(userRole)) { // 顯示無(wú)權(quán)訪問(wèn)提示 next('/403'); return; } } next(); });
在上面的代碼中,我們首先判斷該路由是否需要進(jìn)行權(quán)限驗(yàn)證,如果需要,則判斷當(dāng)前用戶是否有token,如果沒(méi)有則跳轉(zhuǎn)到登錄頁(yè);然后根據(jù)當(dāng)前用戶的角色和路由所需的權(quán)限信息來(lái)判斷是否有權(quán)限訪問(wèn)該路由,如果沒(méi)有則顯示無(wú)權(quán)訪問(wèn)提示。在第一次訪問(wèn)需要權(quán)限驗(yàn)證的路由時(shí),我們會(huì)調(diào)用fetchUser
異步action來(lái)獲取當(dāng)前用戶的角色信息,并將該信息保存到Vuex狀態(tài)管理中。
4. 性能優(yōu)化
為了保持性能最佳,我們可以使用以下方法對(duì)動(dòng)態(tài)路由權(quán)限進(jìn)行優(yōu)化:
- 緩存用戶信息:在用戶登錄后,我們可以將當(dāng)前用戶的角色信息緩存在本地存儲(chǔ)或cookie中,以減少不必要的API調(diào)用。
- 懶加載路由:在路由配置中使用懶加載動(dòng)態(tài)加載路由組件,以減少初始加載時(shí)間和減輕頁(yè)面負(fù)擔(dān)。
- 使用路由緩存:在需要進(jìn)行權(quán)限驗(yàn)證的路由組件中使用路由緩存,以減少組件的重復(fù)渲染和提高頁(yè)面響應(yīng)速度。
到此這篇關(guān)于Vue3+TS實(shí)現(xiàn)動(dòng)態(tài)路由權(quán)限的示例詳解的文章就介紹到這了,更多相關(guān)Vue3動(dòng)態(tài)路由權(quán)限內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
@vue/cli4.x版本的vue.config.js常用配置方式
這篇文章主要介紹了@vue/cli4.x版本的vue.config.js常用配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05iview的table組件自帶的過(guò)濾器實(shí)現(xiàn)
這篇文章主要介紹了iview的table組件自帶的過(guò)濾器實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07使用Vue純前端實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼并實(shí)現(xiàn)倒計(jì)時(shí)
在實(shí)際的應(yīng)用開(kāi)發(fā)中,涉及用戶登錄驗(yàn)證、密碼重置等場(chǎng)景時(shí),通常需要前端實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼的功能,以提升用戶體驗(yàn)和安全性,以下是一個(gè)簡(jiǎn)單的前端實(shí)現(xiàn),演示了如何在用戶點(diǎn)擊發(fā)送驗(yàn)證碼按鈕時(shí)觸發(fā)短信驗(yàn)證碼的發(fā)送,并開(kāi)始一個(gè)倒計(jì)時(shí)2024-04-04Vue實(shí)現(xiàn)導(dǎo)航欄的顯示開(kāi)關(guān)控制
今天小編就為大家分享一篇Vue實(shí)現(xiàn)導(dǎo)航欄的顯示開(kāi)關(guān)控制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Vue中使用定時(shí)器(setInterval、setTimeout)的兩種方式
js中定時(shí)器有兩種,一個(gè)是循環(huán)執(zhí)行?setInterval,另一個(gè)是定時(shí)執(zhí)行?setTimeout,這篇文章主要介紹了Vue中使用定時(shí)器?(setInterval、setTimeout)的兩種方式,需要的朋友可以參考下2023-03-03vue 框架下自定義滾動(dòng)條(easyscroll)實(shí)現(xiàn)方法
這篇文章主要介紹了vue 框架下自定義滾動(dòng)條(easyscroll)實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08vue之Vue.use的使用場(chǎng)景及說(shuō)明
這篇文章主要介紹了vue之Vue.use的使用場(chǎng)景,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Vue.js設(shè)計(jì)與實(shí)現(xiàn)分支切換與清除學(xué)習(xí)總結(jié)
這篇文章主要為大家介紹了Vue.js設(shè)計(jì)與實(shí)現(xiàn)分支切換與清除學(xué)習(xí)總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05