第十八节 vue3 elementplus 路由守卫

本文介绍了在Vue3项目中结合ElementPlus如何配置路由守卫,实现登录检查和白名单功能。详细讲解了在`permission.js`中判断用户token,以及在`getters.js`中设置相关逻辑,确保未登录用户只能访问特定页面。通过在`main.js`中引入`permission.js`,实现在页面刷新后仍能保持正确的权限控制。最后总结了路由守卫的使用方法,强调了回调函数的参数及导航控制。这是一个关于前端开发,特别是Vue.js技术栈中的实践分享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录


目录

系列文章目录

前言

操作方法

总结


前言

在 Vue 中,路由守卫(Route Guards)是一个用于控制路由访问的机制。它们可以在路由被访问之前或之后执行一些操作,例如检查用户身份验证或权限。

Vue Router 提供了几种类型的路由守卫:全局前置守卫、全局后置守卫、路由独享的守卫。

这节我们主要配置下项目得路由守卫。

实现得功能:

1》只有登录才能访问系统

2》定义白名单(没有登录的时候可以访问)


操作方法

  1. 在router文件夹下新建permission.js。导入router store
     
  2. 在store中新建getters.js文件并导出getter
    export default {
      token: (state) => state.app.token
    
    }
    

     
  3.   permission.js 判断是否有token,有进入正常页面,没有进入白名单页面

Vue 3 中使用 TypeScript 实现路由守卫,通常依赖于 `vue-router` 库。`vue-router` 提供了全局前置守卫、全局后置钩子、路由独享守卫以及组件内的守卫等多种方式来控制导航行为。 ### 全局前置守卫 全局前置守卫通常用于权限验证、登录检查等场景。通过 `router.beforeEach` 方法可以拦截所有导航请求,并根据条件决定是否允许导航继续执行。 ```ts import { createRouter, createWebHistory, RouteRecordRaw } from &#39;vue-router&#39; import { useUserStore } from &#39;@/stores/userStore&#39; // 假设你使用 Pinia 管理状态 const routes: Array<RouteRecordRaw> = [ { path: &#39;/login&#39;, name: &#39;Login&#39;, component: () => import(&#39;@/views/Login.vue&#39;) }, { path: &#39;/dashboard&#39;, name: &#39;Dashboard&#39;, component: () => import(&#39;@/views/Dashboard.vue&#39;), meta: { requiresAuth: true } // 添加 meta 字段表示该路由需要认证 } ] const router = createRouter({ history: createWebHistory(), routes }) router.beforeEach((to, from, next) => { const userStore = useUserStore() const isAuthenticated = userStore.isAuthenticated // 从 Pinia 中获取用户认证状态 if (to.meta.requiresAuth && !isAuthenticated) { // 如果目标路由需要认证且用户未登录,则跳转到登录页 next({ name: &#39;Login&#39; }) } else { // 否则继续导航 next() } }) export default router ``` ### 路由独享守卫 路由独享守卫是指为某个特定的路由配置的守卫逻辑,适用于需要对特定页面进行特殊处理的情况。 ```ts const routes: Array<RouteRecordRaw> = [ { path: &#39;/profile&#39;, name: &#39;Profile&#39;, component: () => import(&#39;@/views/Profile.vue&#39;), beforeEnter: (to, from, next) => { const userStore = useUserStore() if (userStore.isAuthenticated) { next() } else { next({ name: &#39;Login&#39; }) } } } ] ``` ### 组件内守卫 组件内守卫允许在组件内部定义导航逻辑,适用于需要根据组件状态进行导航控制的情况。常用的组件内守卫包括 `beforeRouteEnter`、`beforeRouteUpdate` 和 `beforeRouteLeave`。 ```ts <script setup lang="ts"> import { beforeRouteEnter } from &#39;vue-router&#39; import { useUserStore } from &#39;@/stores/userStore&#39; const userStore = useUserStore() beforeRouteEnter((to, from, next) => { if (userStore.isAuthenticated) { next() } else { next({ name: &#39;Login&#39; }) } }) </script> ``` ### 完整示例 以下是一个完整的示例,展示了如何在 Vue 3 + TypeScript 项目中配置路由守卫: #### 1. 安装依赖 确保你已经安装了 `vue-router` 和 `pinia`(或其他状态管理库): ```bash npm install vue-router@4 pinia ``` #### 2. 创建路由配置文件 `router/index.ts` ```ts import { createRouter, createWebHistory, RouteRecordRaw } from &#39;vue-router&#39; import { useUserStore } from &#39;@/stores/userStore&#39; const routes: Array<RouteRecordRaw> = [ { path: &#39;/login&#39;, name: &#39;Login&#39;, component: () => import(&#39;@/views/Login.vue&#39;) }, { path: &#39;/dashboard&#39;, name: &#39;Dashboard&#39;, component: () => import(&#39;@/views/Dashboard.vue&#39;), meta: { requiresAuth: true } }, { path: &#39;/profile&#39;, name: &#39;Profile&#39;, component: () => import(&#39;@/views/Profile.vue&#39;), beforeEnter: (to, from, next) => { const userStore = useUserStore() if (userStore.isAuthenticated) { next() } else { next({ name: &#39;Login&#39; }) } } } ] const router = createRouter({ history: createWebHistory(), routes }) router.beforeEach((to, from, next) => { const userStore = useUserStore() const isAuthenticated = userStore.isAuthenticated if (to.meta.requiresAuth && !isAuthenticated) { next({ name: &#39;Login&#39; }) } else { next() } }) export default router ``` #### 3. 创建用户状态管理模块 `stores/userStore.ts` ```ts import { defineStore } from &#39;pinia&#39; export const useUserStore = defineStore(&#39;user&#39;, { state: () => ({ isAuthenticated: false // 初始状态为未登录 }), actions: { login() { this.isAuthenticated = true }, logout() { this.isAuthenticated = false } } }) ``` #### 4. 在组件中使用组件内守卫 `views/Profile.vue` ```vue <template> <div>用户个人资料页面</div> </template> <script setup lang="ts"> import { beforeRouteEnter } from &#39;vue-router&#39; import { useUserStore } from &#39;@/stores/userStore&#39; const userStore = useUserStore() beforeRouteEnter((to, from, next) => { if (userStore.isAuthenticated) { next() } else { next({ name: &#39;Login&#39; }) } }) </script> ``` 通过上述方式,可以在 Vue 3 + TypeScript 项目中灵活实现路由守卫,确保应用的安全性和用户体验。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hongc93

感谢鼓励 继续航行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值