Vue3:menu导航栏出现多个同一跳转路径的菜单处理
文章目录
-
- 需求整理
- 实现思路
- 实现过程
需求整理,实现思路
最近公司想将之前老的项目整理出来,因为这个老项目内容太杂什么页面都往里面塞,导致菜单特别多,公司就像将这个老的项目迁出来,这个旧的项目本来是后端PHP写的。没有前后分离,导致现在项目需要修改东西,都是后端自己做,导致处理成本增加。所以提出来将项目迁离出来,前后端分离。我们想的是新需求页面做在新项目然后再新的项目中显示旧项目页面。
现在我就想的是如果在新项目中显示旧的项目页面,但是在vue中路由跳转一般都是一个页面对应一个路由,旧项目页面太多上百个,如果旧页面还没迁离出来,新的项目已经有上百个文件来显示页面,太冗余了,就想着用一个页面现在没有迁离出来的就页面。
实现过程
1.新项目中获取后端返回的页面权限以及页面的路由等信息
2.后端返回的新页面信息,因为现在后端接口还没有出,我就用的其他测试项目数据来实现,后续只要跟后端沟通让他们传递你想要的数据格式即可。
这是后端返回的新项目页面信息,正常展示即可
3.设计后端返回旧页面数据
一、动态路由渲染
1.在我们拿到并处理数据后来实现动态绑定路由。定义路由格式然后绑定到你想要追加到路由中.
public.ts
async function getUserAuthority(ids:any) {//获取用户菜单信息let userAuthority = nulllet NewList = nulllet params = {id:ids,permission_tree:1}await get('/system/user/detail',params).then(res=>{if(res.status_code == 200){userAuthority = res.datalocalStorage.setItem('userType',userAuthority.user_type)//将权限信息保存在本地中//自己编写的菜单信息,然后追加到后端返的菜单中let list =[{id: 116,children:[{id:1161,children:[],parent_id:116,name :'审单管理',web_path : `/gongdan`,links:'https://blog.csdn.net/qq_45061461?type=lately'}],web_icon:'el-icon-coin',name :'审单管理',web_path: null,},{id: 117,children:[{children:[],id:1171,parent_id:117,name :'换货留言列表',web_path : `/gongdan`,links:'https://so.csdn.net/so/search?q=vue3%3Amian,ts%E4%B8%AD%E8%8E%B7%E5%8F%96import.meta.glob&t=&u=&urw='}],web_icon:'el-icon-coin',name :'换货留言列表',web_path: null,}]NewList = userAuthority.permissions.concat(list);sessionStorage.setItem('NavList',JSON.stringify(NewList))}})return NewList
}function forEachRout (){//创建路由格式对象const modules = import.meta.glob("../../views/**");//import.meta.glob来引入多个,单个的文件let params = JSON.parse(sessionStorage.getItem('NavList'));let list = [];params.forEach(item => {if (typeof item.web_path === 'string') {let routerChildrenOne = {path: item.web_path,name: `${item.web_path}/:${item.icon}`,component: modules[`../../views${item.web_path}/index.vue`],meta: {title: item.name,buts: [],requireAuth: true,keepAlive: true,externalLink: item.links,}};list.push(routerChildrenOne);let butOne = item.slug;routerChildrenOne.meta.buts.push(butOne);} else {item.children.forEach(Citem => {let routerChildren = { //如上个函数中的 links就是跳转后端页面的路径, 如果有就改成动态参数路由 path:Citem.links ? `${Citem.web_path}/:${Citem.id}` : Citem.web_path ,name: `${Citem.web_path}/:${Citem.id}`,component: modules[`../../views${Citem.web_path}/index.vue`],meta: {title: Citem.name,buts: [],requireAuth: true,keepAlive: true,externallink:Citem.links}};console.log('routerChildren',routerChildren);list.push(routerChildren);Citem.children.forEach(C_item_C => {let but = C_item_C.slug;routerChildren.meta.buts.push(but);});});}});return list
}async function getRouteAddList() {let parentRoute = null;if (sessionStorage.getItem('NavList')) {let list = forEachRout()//追加到 /index中的chilrend中parentRoute = router.getRoutes().find(route => route.name === 'index');list.forEach(item => {parentRoute.children.push(item);});//将自己更新好的路由独享添加到路由中router.addRoute(parentRoute);}return parentRoute
}//修改外部路径共用一个页面导致路由匹错误的问题
function UpdataRouterObject(params:any){let ro = forEachRout()return ro.filter(item=> item.path == params.path)
}
2.将追加路由的函数完成返回结果
mian.ts中:
//此函数完成返回后再更注册路由,否则在项目中刷新页面就会出现空白页的情况
PublicAPI.getRouteAddList().then(res=>{app.use(pinia)app.use(ElementPlus)app.use(router)app.mount('#app')
})
3.路由:router.ts
const routes = [{path: "/",name: 'login',component: () => import('@/views/login/index.vue'),},{path: "/index",name: 'index',component: () => import('@/views/index/index.vue'),children:[],},
]const router = createRouter({history: createWebHashHistory(),routes
})//路由前置守卫
router.beforeEach((to, from, next) => {//判断进入的路径中是否包含了/gongdan ,就说明是要跳转外部链接的页面if(to.fullPath.indexOf('/gongdan') !== -1){//此方法是传递你将进入的页面信息,然后再获取到之前自己定义的路由数据中对比,重新将正确的路由信息返回回来 再重置掉跳转错误的页面//如: path:/gongdan/:171 和 path:/gongdan/:161 他们跳转的路径不一样但是我需要那到的meta中的数据就一直会是 /gongdsn/:171中的meta所以要方法匹配重置 let params = PublicAPI.UpdataRouterObject(to)to.name = params[0].nameto.meta = params[0].metanext()}else{next();}_store.getNowRouterPath(to)});
4.显示的页面
<script setup lang="ts">
import { onMounted } from "vue";
import useCurrentInstance from "@/hooks/useCurrentInstance";
const { proxy } = useCurrentInstance();onMounted(()=>{})
</script><template><div>//获取到路由传递过来的跳转路径<iframe :src="proxy.$route.meta.externallink" style="width: 100%; height: 100vh;"></iframe></div>
</template><style scoped></style>
小提醒:登录页面后直接进入空白页但是页面上的路径是正确的跳转路径。
原因:项目启动的时候就会走mian.ts中的PublicAPI.getRouteAddList()方法但是该方法里面是获取本地中保存的menu菜单信息,所以本地没有的情况下动态添加的是空的,所以跳转页面会出现空白。
解决方法:
在登录的时候再调用一次该方法就行了
const data = await post("/login",ruleForm);if(data.status_code == 200){let list = data.datalocalStorage.setItem("isAuthenticated", "true"); // 将用户认证状态保存在本地存储中for (const key in list) {if(key != 'expires_in'){localStorage.setItem(key,list[key])}}//获取权限proxy.$PublicAPI.getUserAuthority(list.user_id).then(res=>{//获取请求动态路由proxy.$PublicAPI.getRouteAddList()//获取默认第一菜单的一个页面的路径进行跳转proxy.$PublicAPI.getOnePagePath()})}} catch (error) {console.error("发生错误:", error);}
效果:
相关文章:

Vue3:menu导航栏出现多个同一跳转路径的菜单处理
文章目录 需求整理实现思路实现过程 需求整理,实现思路 最近公司想将之前老的项目整理出来,因为这个老项目内容太杂什么页面都往里面塞,导致菜单特别多,公司就像将这个老的项目迁出来,这个旧的项目本来是后端PHP写的。…...

SAM轻量化应用Auto-SAM、Group-Mix SAM、RAP-SAM、STLM
1. Auto SAM(Auto-Prompting SAM for Mobile Friendly 3D Medical Image Segmentation) 1.1 面临问题 医学背景: (1)与自然图像相比,医学图像的尺寸更小,形状不规则,对比度更低。&…...
深度优化搜索DFS使用详解,看这篇就够了!!!
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树和图的算法。在最坏的情况下,深度优先搜索的性能为O(VE),其中V是顶点数,E是边数。DFS常用于解决连通性问题、路径问题、生成树问题等。 ### D…...

Apache SeaTunnel 正式发布2.3.5版本,功能增强及多个Bug修复
经过两个月的筹备,我们在2.3.4版本基础上进行了新一轮的迭代,本次更新不仅修复了多个关键问题,还引入了若干重要功能增强和性能优化。 在此,我们先提前感谢社区成员的贡献和支持,如果你想升级最新的版本,快…...

interview_bak
flink内存管理 JVM 存在的几个问题: Java 对象存储密度低。一个只包含 boolean 属性的对象占用了16个字节内存:对象头占了8个,boolean 属性占了1个,对齐填充占了7个。而实际上只需要一个bit(1/8字节)就够了。Full GC 会极大地影响性能,尤其是为了处理更大数据而开了很大…...

layui 数据表格 自动定位新增行位置
由于数据表格新增行后没有到新增到当前位置 继续增加的需求: 因为自己是新增行后到最后一行的 所以 就定位到最后一行 并且 高亮 高亮颜色浅 可自行更改 整理了一下 可根据 情况 修改 // 初始化滚动条位置变量 let tableScroll {scrollTob: 0,scrollLeft: 0,…...

window10下安装ubuntu系统以及docker使用
window10下安装ubuntu系统以及docker使用 1. 启用适用于Linux的Windwos子系统2.下载Linux内核更新包3.将 WSL 2 设置为默认版本4.安装Ubuntu<br />直接去Microsoft store里面直接搜索Ubuntu进行安装。5.可能出现的问题1.win10启动ubuntu报错 参考的对象类型不支持尝试的操…...

Netty核心组件介绍
Netty是一款用于创建高性能网络应用程序的高级框架。Netty的核心组件如下: Channel回调Future事件和ChannelHander Channel channel是Java NIO的一个基本构造。可以把Channel看作是传入或传出数据的载体。它可以被打开或关闭,连接或断开连接。 回调 …...

代码审计平台sonarqube的安装及使用
docker搭建代码审计平台sonarqube 一、代码审计关注的质量指标二、静态分析技术分类三、使用sonarqube的目的四、sonarqube流程五、docker快速搭建sonarqube六、sonarqube scanner的安装和使用七、sonarqube对maven项目进行分析八、sonarqube分析报告解析九、代码扫描规则定制十…...
C++ 使用nlohmann/json.hpp库读写json字符串
1. json库 我个人比较喜欢 nlohmann/json.hpp 这个库,因为它只需要一个hpp文件即可,足够轻量! 这是它的github地址。 2. 简单实例代码 #include <iostream> #include <json.hpp> #include <fstream> #include <stri…...

3GPP官网下载协议步骤
1.打开官网 https://www.3gpp.org/ 2.点击 3.在界面选择要找的series,跳转到查找界面 以V2X通信协议为例,论文中通常会看到许多应用: [7] “Study on evaluation methodology of new Vehicle-to-Everything (V2X) use cases for LTE and NR…...
【JAVA】Git 的基本概念和使用方式
Git是一个开源的分布式版本控制系统,由Linus Torvalds创建,用于有效、高速地处理从小到大的项目版本管理。以下是Git的一些基本概念和使用方式的深入探讨: 基本概念 1. 仓库(Repository) 仓库是Git用来保存你的项目…...

C++多态实现原理详解
阅读引言: 我想象了一下, 假如人有突然问我什么是多态, 我该如何给别人说清楚呢?所以写下这篇文章, 希望大家看完有所收获。 ①. 开胃小菜 先看这样一个开胃小菜 这里我有点小小的疑惑, 大小为啥是1。 在C…...

[数据集][目标检测]交通灯检测数据集VOC+YOLO格式2600张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2600 标注数量(xml文件个数):2600 标注数量(txt文件个数):2600 标注…...
关于测试用例
目录 一 测试用例介绍 二 写用例的好处 三 不适合写用例的情况 一 测试用例介绍 测试用例由测试来写,编写时间在需求评审和设计评审(如有)结束后,需求提测前,用例依赖需求文档来编写。一般包含用例标题,…...

一起长锈:3 类型安全的Rust宏(从Java与C++转Rust之旅)
讲动人的故事,写懂人的代码 故事梗概:在她所维护的老旧Java系统即将被淘汰的危机边缘,这位在编程中总想快速完事的女程序员,希望能转岗到公司内部使用Rust语言的新项目组,因此开始自学Rust;然而,在掌握了Rust编程知识之后,为了通过Rust项目组的技术面试,使得转岗成功而…...

《金融研究》:普惠金融改革试验区DID工具变量数据(2012-2023年)
数据简介:本数据集包括普惠金融改革试验区和普惠金融服务乡村振兴改革试验区两类。 其中,河南兰考、浙江宁波、福建龙岩和宁德、江西赣州和吉安、陕西铜川五省七地为普惠金融改革试验区。山东临沂、浙江丽水、四川成都三地设立的是普惠金融服务乡村振兴…...

Prompt|Kimi高阶技巧,99%的人都不知道
大家好,我是无界生长。 今天分享一条咒语,轻松让Kimi帮你生成流程图,学会了的话,点赞收藏起来吧! 效果展示 我们演示一下让kimi帮忙绘制 关注微信公众号“无界生长”的流程图,最终效果图如下所示 效果还不…...
采购管理软件:采购自动化提高效率的5种方式
在采购领域,手动数据输入和耗时的文书工作的时代已经落后了。采购自动化正在改变游戏规则,使企业能够简化流程、降低成本并提高效率。 以下是采购自动化帮助企业提高效率的5种方法。 采购管理软件,采购自动化管理,8Manage SRM,高亚科技 减少手动流程和…...
Android App开机启动
清单文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><uses-permission android:name"andro…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...