Vue3+TS实现动态路由权限的示例详解

 更新时间:2024年01月18日 15:41:01   作者:BUG高级开发工程师  
当我们在开发一个大型的前端应用时,动态路由权限是一个必不可少的功能,本文将介绍如何使用Vue 3和TypeScript来实现动态路由权限,希望对大家有所帮助

当我们在开发一个大型的前端应用时,动态路由权限是一个必不可少的功能。本文将介绍如何使用Vue 3和TypeScript来实现动态路由权限,并且保持性能最佳。

1. 前置知识

在开始之前,你需要对以下知识有基本的了解:

  • Vue 3
  • TypeScript
  • Vue Router

2. 实现思路

动态路由权限的实现思路可以分为以下几个步骤:

  • 创建一个路由守卫,在进入路由之前判断该路由是否需要进行权限验证。
  • 在路由配置中添加meta字段来标记该路由需要进行权限验证,以及该路由所需的权限信息。
  • 创建一个权限验证函数,根据当前用户的角色和路由的权限信息来判断是否有权限访问该路由。
  • 在权限验证函数中调用后端API获取当前用户的角色信息,并将该信息保存到Vuex状态管理中。
  • 在路由守卫中调用权限验证函数,并根据验证结果进行相应的操作,例如跳转到登录页或显示无权访问提示。

3. 具体实现

下面将具体介绍如何使用Vue 3和TypeScript来实现动态路由权限。

3.1 创建路由守卫

首先,我们需要创建一个全局路由守卫来判断该路由是否需要进行权限验证。在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) {
      // 跳转到登录页
      next('/login');
      return;
    }

    const requiredRoles = to.meta.roles;
    const userRole = store.getters['user/role'];
    if (!requiredRoles.includes(userRole)) {
      // 显示无权访问提示
      next('/403');
      return;
    }
  }

  next();
});

在上面的代码中,我们首先判断该路由是否需要进行权限验证,如果需要,则判断当前用户是否有token,如果没有则跳转到登录页;然后根据当前用户的角色和路由所需的权限信息来判断是否有权限访问该路由,如果没有则显示无权访问提示。

3.2 添加路由元信息

接下来,在路由配置中添加meta字段来标记该路由需要进行权限验证,以及该路由所需的权限信息。在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,
});

在上面的代码中,我们在路由配置中添加了meta字段来定义该路由需要进行权限验证,以及该路由所需的权限信息。

3.3 创建权限验证函数

接下来,我们需要创建一个权限验证函数来判断当前用户是否有权限访问该路由。在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 }) {
      // 调用后端API获取当前用户的角色信息
      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 };

在上面的代码中,我们首先定义了一个UserState接口来描述用户状态;然后在userModule中定义了一个fetchUser异步action来调用后端API获取当前用户的角色信息,并将该信息保存到Vuex状态管理中。

3.4 调用权限验证函数

最后,在路由守卫中调用权限验证函数,并根据验证结果进行相应的操作。在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) {
      // 跳转到登录页
      next('/login');
      return;
    }

    const requiredRoles = to.meta.roles;
    const userRole = store.getters['user/role'];

    if (!userRole) {
      // 获取当前用户的角色信息
      await store.dispatch('user/fetchUser');
    }

    if (!requiredRoles.includes(userRole)) {
      // 显示无权访问提示
      next('/403');
      return;
    }
  }

  next();
});

在上面的代码中,我们首先判断该路由是否需要进行权限验证,如果需要,则判断当前用户是否有token,如果没有则跳转到登录页;然后根据当前用户的角色和路由所需的权限信息来判断是否有权限访问该路由,如果没有则显示无权访问提示。在第一次访问需要权限验证的路由时,我们会调用fetchUser异步action来获取当前用户的角色信息,并将该信息保存到Vuex状态管理中。

4. 性能优化

为了保持性能最佳,我们可以使用以下方法对动态路由权限进行优化:

  • 缓存用户信息:在用户登录后,我们可以将当前用户的角色信息缓存在本地存储或cookie中,以减少不必要的API调用。
  • 懒加载路由:在路由配置中使用懒加载动态加载路由组件,以减少初始加载时间和减轻页面负担。
  • 使用路由缓存:在需要进行权限验证的路由组件中使用路由缓存,以减少组件的重复渲染和提高页面响应速度。

到此这篇关于Vue3+TS实现动态路由权限的示例详解的文章就介绍到这了,更多相关Vue3动态路由权限内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Vue-cli 3.0搭建Vue项目的方法

    使用Vue-cli 3.0搭建Vue项目的方法

    这篇文章主要介绍了使用Vue-cli 3.0搭建Vue项目的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Vue.config.js配置报错ValidationError: Invalid options object解决办法

    Vue.config.js配置报错ValidationError: Invalid options object解

    这篇文章主要给大家介绍了关于Vue.config.js配置报错ValidationError: Invalid options object的解决办法,主要由于vue.config.js配置文件错误导致的,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • vue的组件通讯方法总结大全

    vue的组件通讯方法总结大全

    这篇文章主要为大家介绍了非常全面vue的组件通讯方法总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Vue使用babel-polyfill兼容IE解决白屏及语法报错问题

    Vue使用babel-polyfill兼容IE解决白屏及语法报错问题

    这篇文章主要介绍了Vue使用babel-polyfill兼容IE解决白屏及语法报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Vue两个同级组件传值实现

    Vue两个同级组件传值实现

    Vue组件之间是有联系的,避免不了组件之间要互相传值,那么如何实现Vue两个同级组件传值,本文就来介绍一下,感兴趣的可以了解一下
    2021-07-07
  • vue引入element-ui之后,页面是空白的问题及解决

    vue引入element-ui之后,页面是空白的问题及解决

    这篇文章主要介绍了vue引入element-ui之后,页面是空白的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • vue3.x lodash在项目中管理封装指令的优雅使用

    vue3.x lodash在项目中管理封装指令的优雅使用

    这篇文章主要为大家介绍了vue3.x lodash在项目中管理封装指令的优雅使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • iView框架问题整理小结

    iView框架问题整理小结

    这篇文章主要介绍了iView框架问题整理小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 基于VuePress 轻量级静态网站生成器的实现方法

    基于VuePress 轻量级静态网站生成器的实现方法

    VuePress是一个基于Vue的轻量级静态网站生成器以及为编写技术文档而优化的默认主题。这么文章给大家详细介绍了vuepress 静态网站生成器的方法,需要的朋友参考下吧
    2018-04-04
  • Vue.js图片滑动验证的实现示例

    Vue.js图片滑动验证的实现示例

    为了防止有人恶意使用脚本进行批量操作,会设置图片滑动验证,本文就介绍了Vue.js图片滑动验证的实现示例,感兴趣的可以了解一下
    2023-05-05

最新评论