vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > Vue3动态路由与手动导航

Vue3实现动态路由与手动导航

作者:头发秃头小宝贝

这篇文章主要为大家详细介绍了如何在 Vue 3 中实现动态路由注册和手动导航,确保用户访问的页面与权限对应,感兴趣的小伙伴可以跟随小编一起学习一下

在后台管理系统中,前端的路由往往需要根据用户的权限动态生成。这篇文章将重点介绍如何在 Vue 3 中实现动态路由注册手动导航,确保用户访问的页面与权限对应。

1. 动态路由的需求与原理

为什么需要动态路由?

动态路由的原理

2. 静态路由与动态路由配置

静态路由

静态路由是所有用户共享的基本路由,如登录页、404页等。

import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router';
import Layout from '@/layout/admin.vue';

const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    component: Layout,
    name: 'admin',
  },
  {
    path: '/login',
    name: 'login',
    component: () => import('@/pages/login/index.vue'),
    meta: { title: '登录页' },
  },
  {
    path: '/:pathMatch(.*)*',
    name: 'NotFound',
    component: () => import('@/pages/404/index.vue'),
    meta: { title: '404' },
  },
];

动态路由

动态路由需要根据后端返回的数据进行注册:

const asyncRoutes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: '/',
    component: () => import('@/pages/index/index.vue'),
    meta: { title: '首页' },
  },
  {
    path: '/goods/list',
    name: '/goods/list',
    component: () => import('@/pages/goods/list.vue'),
    meta: { title: '商品列表' },
  },
  {
    path: '/category/list',
    name: '/category/list',
    component: () => import('@/pages/category/list.vue'),
    meta: { title: '分类列表' },
  },
];

3. addRoutes 实现动态路由注册

addRoutes 方法

该方法接收后端返回的菜单数组,并将匹配的动态路由添加到主路由 admin 下。

import { router } from '@/router/index';

export const addRoutes = (routesArray: Array<MenusArray>) => {
  let hasNewRoutes = false;

  const addRoutesFromMenus = (menus: Array<MenusArray>) => {
    menus.forEach((menu) => {
      // 查找匹配的动态路由
      const route = asyncRoutes.find((r) => r.path === menu.frontpath);
      // 添加到router中
      if (route && !router.hasRoute(route.path)) {
        router.addRoute('admin', route);
        hasNewRoutes = true;
      }
      // 递归处理子菜单
      if (menu.child && menu.child.length > 0) {
        addRoutesFromMenus(menu.child);
      }
    });
  };

  addRoutesFromMenus(routesArray);
  return hasNewRoutes;
};

解释

4. 路由守卫中调用 addRoutes

router.beforeEach 路由守卫中,调用 addRoutes 注册动态路由,并实现手动导航

import { getToken } from '@/utils/auth';
import store from '@/store';
import { addRoutes } from '@/router/index';

router.beforeEach(async (to, from, next) => {
  const token = getToken();
  let hasNewRoutes = false;

  // 显示全局加载状态
  showFullLoading();

  // 未登录跳转到登录页
  if (!token && to.name !== 'login' && to.name !== 'NotFound') {
    return next('/login');
  }

  // 已登录访问登录页,重定向到主页
  if (token && to.name === 'login') {
    return next('/');
  }

  // 已登录状态下,动态添加路由
  if (token) {
    await store.dispatch('user/getUserInfo'); // 拉取用户信息
    hasNewRoutes = addRoutes(store.getters['menu/getMenus']); // 添加动态路由
  }

  // 设置页面标题
  if (to.meta.title) {
    document.title = `${to.meta.title}-测试后台管理`;
  } else {
    document.title = '测试后台管理';
  }

  // 手动导航:如果添加了新路由,重新跳转当前页面
  hasNewRoutes ? next(to.fullPath) : next();
});

手动导航的必要性

5. 完整流程

6. 总结

以上就是Vue3实现动态路由与手动导航的详细内容,更多关于Vue3动态路由与手动导航的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文