Vue3控制路由权限(组合式)
Vue3控制路由权限(组合式)
写在开头
有一个新的项目,本来想从老的一个项目拿来当壳子,中间发现老项目的路由权限控制是通过axios
的response
拦截器做的,判断返回的status
是不是401
状态,如果是就跳转到login
页面.总感觉挂怪的,因为:
- 如果导向的页面没有在
onmounted
的页面初始渲染方法中向后端发送请求的话,是不会跳转的。 - 这是多余的请求
我们应当在前端路由层面做处理,也就是路由守卫
代码实现
1.使用pinia
做状态管理,存储token
值:
import { ref } from 'vue'
import { defineStore } from 'pinia'
export const useTokenStore = defineStore('token', () => {
const token = ref('')
return { token }
})
2.在router.js
文件中
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
name: 'home',
component: HomeView,
meta: { requiresAuth: true }
},
{
path: '/login',
name: 'login',
component: () => import('../views/LoginView.vue')
}
]
});
router.beforeEach(async (to, from, next) => {
const tokenStore = useTokenStore();
if (to.meta.requiresAuth && !tokenStore.token) {
next({ name: 'login' ,query: { redirect: to.fullPath }});
} else {
next();
}
});
此处
beforeEach
是全局前置守卫 ,meta
字段是路由元信息,我们在需要进行控制的路由上加上此信息以判断,我们判断是否有权限,如果没有则导向login
页,完整的url
是这样的http://localhost:5173/login?redirect=/
3.在login.vue
中:
import { useTokenStore } from '@/stores/token';
const tokenStore = useTokenStore()
const router = useRouter()
const route=useRoute()
const Api = {
Login: '/login',
}
function isNullOrWhiteSpace(str) {
return str == null || str.trim().length === 0;
}
function onSubmit() {
HttpGet(Api.Login, formData.value).then(res => {
if (res.status) {
tokenStore.token = res.data.token
if(!isNullOrWhiteSpace(route.query.redirect)) {
router.push(route.query.redirect)
return;
}
router.push('/');
}
})
}
最后我们判断
url
是否存在redirect
参数,如果存在则跳转向此,不存在则转向首页
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)