vue动态路由的使用

2023-11-06

项目创建过程中经常遇到的一个需求就是权限管理,本文就我在使用动态路由的过程中进行一个总结
首先,前端想要实现对菜单的动态渲染实际上有两种操作方式

1.前端还是书写静态路由表,根据后端传来的code利用v-if去判断渲染菜单项
实际这种使用方式并不可取,因为不方便后期维护。
2.前端只写没有权限控制的login,register, 404 页面的路由,其余路由则是根据后端传过来的,拼接入路由表。

这里我在项目中使用的第二种方法

首先,我们要先理解动态路由表的请求和添加都是发生在路由守卫里边的。
不废话直接上代码

const whiteList = ["/login", "/register"];  // 白名单,不需要token也可以进入的页面
router.beforeEach(async (to, from, next) => {
  NProgress.start();
  // document.title = to.meta.title;
  // 获取用户token,用来判断当前用户是否登录
  const hasToken = getToken();
  if (hasToken) {
    if (whiteList.indexOf(to.path) !== -1) {
      next();
      NProgress.done();
    } else {
      // 用来获取后台拿到的路由
      const route = await store.getters.addRouters;
      // console.log("to.path", to.path, route);
      if (route && route.length > 0) {
        if (to.path === "/") {
          next("/console");
        }
        next();
        NProgress.done();
      } else {
        store.dispatch("queryMenuList").then(({ servers }) => {
          // console.log("拿到的初始路由结构", servers);
          filterAsyncRouter(servers);
          const menus = store.getters.addRouters;
          const routerMap = newRouter(menus);
          for (let key in routerMap) {
            router.addRoute("layout", routerMap[key]);
          }
          router.addRoute({ // 这里是对404页面的一个重定向
            path: "*",
            redirect: "/404",
            hidden: true,
          });
          let homeChildren = router.options.routes[2];
          // homeChildren = menus
          homeChildren["children"] = routerMap;
          // console.log("最终的", menus);
          next({
            ...to,
            replace: true,
          }); // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
          NProgress.done();
        });
      }
      next();
      NProgress.done();
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      // 需要跳转的路由是否是whiteList中的路由,若是,则直接条状
      next();
    } else {
      // 需要跳转的路由不是whiteList中的路由,直接跳转到登录页
      // console.log("redirect",to.fullPath)
      next("/login?redirect=" + to.fullPath);
      // 结束精度条
      NProgress.done();
    }
  }
});

store.dispatch(“queryMenuList”)这里是我在vuex中定义的请求动态路由表的方法;

filterAsyncRouter方法

从后端直接请求过来的动态路由表往往是不能直接使用的,我们需要把他的数据结构转换成我们前端路由表的结构。并且把组件对应到路由中去。

const _import = require("@/router/_import_" + process.env.NODE_ENV); //获取组件的方法
function filterAsyncRouter(asyncRouterMap) {
  // 过滤动态路由
  const newArr = [];
  asyncRouterMap.forEach((item) => {
    const component = _import(item.component);
    // console.log("component", component, item.component ,item.path);
    let routerTemplate = {
      name: item.serverName,
      id: item.id,
      path: item.path,
      component,
    };
    if (item.children && item.children.length > 0) {
      routerTemplate.children = filterRouter(item.children);
    }
    newArr.push(routerTemplate);
  });
  return newArr;
}

_import是引入组件的方法,具体作用就是把组件对应到路由表中去

module.exports = (file) => {
  // console.log("传进来的组件地址", file);
  var a = true;
  try {
    // (resolve) => require("@/views/" + file + "/index.vue", resolve)
    return require("@/views/" + file + "/index.vue").default;
  } catch (e) {
    a = false;
  }
  if (a) {
    // console.log("要找的地址2", "@/views/" + file + "/index.vue");
    return require("@/views/" + file + "/index.vue").default;
  }
};
拿到合格的路由之后我们就可以把路由放到项目路由表中去了

先看一下我们的静态路由

// 配置项目中没有涉及权限的公共路由
export const constantRoutes = [
  {
    path: "/login", // 登陆
    component: login,
  },
  {
    path: "/register", // 登陆
    component: register,
  },
  {
    path: "/",
    name: "layout",
    component: layout,
    children: [],
  },
  {
    path: "/404",
    name: "notFound",
    component: notFound,
  },
  // {
  //   path: "*",
  //   redirect: "/404",
  // },
];

我使用的是vue-router是@3.5.2版本所以添加路由使用的是addRoute方法,低版本的vue-router可以尝试addRoutes方法。(ps:addRoute方法需要一个对象一个对象添加,因此下边使用了for循环,addrouters方法可以直接把数组添加到路由表中)

for (let key in routerMap) {
            router.addRoute("layout", routerMap[key]);
    }
router.addRoute({
            path: "*",
            redirect: "/404",
            hidden: true,
  });  

或者:addRoute可以选则路由插入位置。

router.addRoutes(menus.concat([{
              path: '*',
              redirect: '/404',
              hidden: true
            }]));

给大家解释一下上边对404的疑问,之所以静态路由表把重定向去掉,是因为使用动态路由是异步加载,如果把重定向放静态路由就会导致404优先级变得很高。放在异步路由之后再加载重定向,无疑是最合理且符合项目要求的。

到这里异步路由就加载完毕了,可以正常使用。后边就是对多级菜单的动态渲染了,如果有需求可以参考另一篇文章
对多级菜单的动态渲染

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue动态路由的使用 的相关文章

随机推荐

  • Android移动开发-使用OpenGL来绘制3D纹理图的实现

    OpenGL 全写Open Graphics Library 是指定义了一个跨编程语言 跨平台的编程接口规格的专业的图形程序接口 它用于三维图像 二维的亦可 是一个功能强大 调用方便的底层图形库 OpenGL是行业领域中最为广泛接纳的 2D
  • 『HTML&CSS』选择器(一)

    前面我们说过 CSS一共分为两大块 选择器和声明块 本篇博客主要对选择器进行一些简单的介绍 元素选择器 我们前面使用的都是元素选择器 通过元素选择器可以选择页面中的所有指定元素 语法 元素名 标签名 代码演示
  • 深度学习:Opencv的BlobfromImage如何工作

    深度学习 Opencv的BlobfromImage如何工作 1 原理 1 2 均值减法是什么 1 3 cv2 dnn BlogFromImage 2 源码 参考 想要从深度神经网络获取正确的预测 首先需要预处理数据 在深度学习 图像分类中
  • vue入门者uni-app开发之---入坑

    vue入门者uni app开发之 入坑 前言 起步 项目结构 开始开发 举例登陆全局保持状态 退出登陆 前言 作为一个刚入门vue的前端 我们公司主要运营公众号网页 之前一直用的jq 发现用户体验差的一匹 后来公司决定将前端技术栈定为vue
  • js基础面试题

    一 值类型与引用类型 1 js如何判断数据类型 值类型 javascript存储数据两个区域 栈 堆 栈 通常空间是固定 堆通常空间是动态的分配 js值类型 名称与值都存储在栈中 var a 15 值类型 var b a 把a的值赋值给 b
  • arm芯片厂家排名_国产芯片目前至少有10种,其中有3种,达到了世界顶尖水平

    说起来 中国芯的发展史称得上是一部磨难史 因为技术 设备 人才等都被西方国家封锁 就是为了让中国这个大市场巨额进口芯片 但这些年 中国的企业也没有闲着 可以说把世界上的主流的芯片架构尝试了个遍 就是为了找出一台适合自己发展的路来 目前国内的
  • 9款超级实用的网页设计工具,快来看看有没有你用过的

    随着网络时代的快速发展 游戏 购物 音乐 影视和社交网站的兴起都表明了网页设计的重要性 网页设计工具作为网页设计师的生产工具 自然要选择好的 让我们分享9个高质量的网页设计工具 让您的设计效率悄然提高 即时设计 即时设计是一款免费的在线 U
  • 如何选择LDO (LDO的关键指标及定义)

    1 LDO选型关键指标及定义 1 1 输入电压范围 LDO的输入电压范围决定了最低的可用输入电源电压 指标可能提供宽的输入电压范围 最小的输入电压VIN必须大于VOUT VDO 需要注意 这与器件Datasheet中所给出的输入电压最小值无
  • 风格迁移:一文梳理经典方法发展脉络及原理:Gram矩阵、WCT、WCT2

    风格迁移 一文梳理经典方法发展脉络及原理 1 Image Style Transfer Using Convolutional Neural Networks Gram矩阵 CVPR2016 1 1 概述 1 2 方法 2 Deep Pho
  • 代码重定位

    1 程序段介绍 参见博客 C语言程序段的定义 实际应用分析 2 什么是代码重定位 代码重定位就是将代码搬运到链接地址处 实际在操作时就是将代码复制一份到链接地址处 我们把代码下载到设备的Flash中 然后代码运行却要求另一个地址 于是我们就
  • vue图片预览放大,缩小,旋转等功能,用 v-viewer来实现,还有他的api

    前言 推荐一款特别优秀的插件 viewerjs 他可以实现图片预览功能 点击图片实现弹框操作图片的效果 点我进入GitHub地址 实现效果 这里说先下实现步骤 步骤一 安装 注意这里是 v viewer npm install v view
  • Spark函数式编程基础

    目录 一 函数定义与使用 1 函数式编程简介 2 匿名函数 3 占位符语法 4 高阶函数 5 闭包 二 针对容器的操作 1 遍历操作 2 映射操作 3 过滤操作 4 规约操作 5 拆分操作 一 函数定义与使用 1 函数式编程简介 函数式编程
  • maven怎么引入jdom_Maven添加本地依赖

    用mvn命令把本地jar包添加到maven仓库 mvn install install file Dfile f aliyn openservices jar DgroupId com aliyun DartifactId openserv
  • Python:sklearn数据预处理中fit(),transform()与fit_transform()的区别

    1 概述 注意这是数据预处理中的方法 Fit Method calculates the parameters and and saves them as internal objects 解释 简单来说 就是求得训练集X的均值啊 方差啊
  • STM32与拉力传感器通信

    目录 第一部分 设备通信图 第二部分 设备接线 HX711与传感器的接线 HX711与MCU的接线 第三部分 驱动代码 HX711引脚初始化 Dout CLK HX711读取数据函数 HX711获取传感器的值 头文件定义 实验结果 第一部分
  • linux svn 记住密码,Linux(Ubuntu)下保存SVN账户密码-Fun言

    Linux Ubuntu 下用SVN进行更新等操作时 总是提示输入用户名和密码 很不方便 解决方法1 推荐 不需要修改配置文件 只需要用sudo执行一次svn命令 并记住密码就行了 记住密码需要权限的 sudosvn ci m featur
  • 如何让Chrome浏览器允许http网站打开摄像头和麦克风

    问题来源 本地运行的项目调用摄像头好用 访问线上地址 发现调用摄像头的方法都不存在 问了度娘 发现该问题与浏览器的安全策略有关 出于安全考虑 浏览器是不允许随便开启摄像头的 https协议下方可开启 解决 这一项功能要用到谷歌浏览器的实验性
  • window 安装Hadoop3.0.0

    第一步 Hadoop 官网下载地址 https hadoop apache org releases html 第二步 将下载hadoop 3 0 0 tar gz 解压至指定文件夹 C hadoop 第三步 配置hadoop 涉及环境变量
  • 奇葩问题之奇葩解决方案系列——安卓手机外部加载Assetbundle

    一 前言 首先 这个需求是这么被创造出来的 我们要在安卓手机上加载超过一个G的资源 正常的Unity的程序员都会立马想到使用Assetbundle进行资源打包和加载 我当然也不例外 于是乎我就吭哧吭哧的熟练的对资源进行打包 然后用异步 As
  • vue动态路由的使用

    项目创建过程中经常遇到的一个需求就是权限管理 本文就我在使用动态路由的过程中进行一个总结 首先 前端想要实现对菜单的动态渲染实际上有两种操作方式 1 前端还是书写静态路由表 根据后端传来的code利用v if去判断渲染菜单项 实际这种使用方