vue-element-admin顶部导航栏的修改

        基于vue-element-admin的顶部一级导航栏的调整,因为一级路由过多导致其他元素被挤到第二行,故现在将原来一级路由数组拆分成两个数组,第二个数组以子菜单显示

       关键处调整代码

html

<el-menu:active-text-color="variables.menuActiveText":default-active="activeMenu"mode="horizontal"@select="handleSelect"><div v-for="item in displayedRoutes" :key="item.path" class="nav-item"><app-link :to="resolvePath(item)"><el-menu-item v-if="!item.hidden" :index="item.path"><i:class="item.meta && item.meta.icon ? item.meta.icon : 'el-icon-house'"></i>{{item.meta ? item.meta.title : item.children[0].meta.title}}</el-menu-item></app-link></div><el-submenu v-if="hiddenRoutes.length > 0" index="coll"><template slot="title"><i class="el-icon-more"></i></template><div v-for="item in hiddenRoutes" :key="item.path" class="nav-item"><app-link :to="resolvePath(item)"><el-menu-item v-if="!item.hidden" :index="item.path"><i:class="item.meta && item.meta.icon ? item.meta.icon : 'el-icon-house'"></i>{{item.meta ? item.meta.title : item.children[0].meta.title}}</el-menu-item></app-link></div></el-submenu></el-menu>

js

export default {name: "Topbar",components: {AppLink,},data() {return {activeIndex: "1",logo: titlePng,// avatar: sessionStorage.getItem("avatar"),routes: constantRoutes,};},computed: {...mapGetters(["permission_routes", "async_routes", "avatar"]),activeMenu() {const route = this.$route;const { meta, path } = route;// if set path, the sidebar will highlight the path you setif (meta.activeMenu) {return meta.activeMenu;}// 如果是首页,首页高亮if (path === "/dashboard") {return "/";}// 如果不是首页,高亮一级菜单const activeMenu = "/" + path.split("/")[1];return activeMenu;},variables() {return variables;},sidebar() {return this.$store.state.app.sidebar;},displayedRoutes() {// 这里可以根据需要定义展示的路由项return this.routes.slice(0, 9); // 例如,展示前 9 个路由},hiddenRoutes() {// 返回剩余的路由项const hidden = this.routes.slice(9); // 省略的路由项return hidden.length > 0 ? hidden : []; // 只有在有省略项时返回},},watch: {activeMenu(newVal, oldVal) {this.handleSelect(newVal);},},mounted() {this.initCurrentRoutes();},methods: {// 通过当前路径找到二级菜单对应项,存到store,用来渲染左侧菜单initCurrentRoutes() {this.$router.addRoutes(this.async_routes);this.routes = this.permission_routes; // 动态路由赋值const { path } = this.$route;let route = this.routes.find((item) => item.path === "/" + path.split("/")[1]);// 如果找不到这个路由,说明是首页if (!route) {route = this.routes.find((item) => item.path === "/");}this.$store.commit("permission/SET_CURRENT_ROUTES", route);this.setSidebarHide(route);},// 判断该路由是否只有一个子项或者没有子项,如果是,则在一级菜单添加跳转路由isOnlyOneChild(item) {if (item.children && item.children.length === 1) {return true;}return false;},resolvePath(item) {// 如果是个完成的url直接返回if (isExternal(item.path)) {return item.path;}// 如果是首页,就返回重定向路由if (item.path === "/") {const path = item.redirect;return path;}// 如果有子项,默认跳转第一个子项路由let path = "";/*** item 路由子项* parent 路由父项*/const getDefaultPath = (item, parent) => {// 如果path是个外部链接(不建议),直接返回链接,存在个问题:如果是外部链接点击跳转后当前页内容还是上一个路由内容if (isExternal(item.path)) {path = item.path;return;}// 第一次需要父项路由拼接,所以只是第一个传parentif (parent) {path += parent.path + "/" + item.path;} else {path += "/" + item.path;}// 如果还有子项,继续递归if (item.children) {getDefaultPath(item.children[0]);}};if (item.children) {getDefaultPath(item.children[0], item);return path;}return item.path;},handleSelect(key, keyPath) {// 把选中路由的子路由保存storeconst route = this.routes.find((item) => item.path === key);this.$store.commit("permission/SET_CURRENT_ROUTES", route);this.setSidebarHide(route);},// 设置侧边栏的显示和隐藏setSidebarHide(route) {if (!route.children || route.children.length === 1) {this.$store.dispatch("app/toggleSideBarHide", true);} else {this.$store.dispatch("app/toggleSideBarHide", false);}},async logout() {await this.$store.dispatch("user/logout");this.$router.push(`/login?redirect=${this.$route.fullPath}`);},toggleFullScreen() {// 检查浏览器是否支持全屏 APIif (screenfull.isEnabled) {screenfull.toggle(); // 切换全屏模式} else {console.warn("该浏览器不支持全屏");}},},
};
</script>

       拆分逻辑是如果数组长度超过九个就拆分。如果想要根据不同浏览器窗口大小去拆分显示,需要去监听浏览器的实时宽度,计算整行所有元素的长度总和,如果超出则将超出的路由加入子菜单中显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455444.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何为自己的跨境网站添加多国语言翻译功能及推荐起尔网定制与插件开发

如何为自己的跨境网站添加多国语言翻译功能及推荐起尔网定制与插件开发 在全球化的浪潮下&#xff0c;跨境电商成为越来越多企业拓展国际市场的重要途径。然而&#xff0c;语言障碍成为了一个不可忽视的问题。为了更好地服务全球用户&#xff0c;为自己的跨境网站添加多国语言…

199116-50-2,Mito-Tracker Orange CMTMRos是一种高亲和力的线粒体染色剂

一、基本信息 中文名称&#xff1a;线粒体橙色荧光探针 英文名称&#xff1a;Mito-Tracker Orange CMTMRos CAS号&#xff1a;199116-50-2 分子式&#xff1a;C24H24Cl2N2O 分子量&#xff1a;427.37 存储条件&#xff1a;避光、冷藏保存&#xff0c;避免长时间暴露于光线…

基于SSM健身国际俱乐部系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;场地类别管理&#xff0c;场地信息管理&#xff0c;运动项目管理&#xff0c;场地类型管理&#xff0c;项目类型管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心…

QML----Webengineview点击网页上的下载没反应,下载文件

问题 使用webe加载网页时&#xff0c;点击下载页面会没有反应。原因就是它默认是关闭下载功能 解决 需要在profile里监听下载事件打开onDownloadRequested,当有下载时会触发这个信号,会获取到一个WebEngineDownloadItem这是下载的东西,查询它的一些相关参数,可以修改路径和开…

网站前端登录加密方案调查

https://zhuanlan.zhihu.com/p/625204114 案例 国家政务服务平台 账号设置 (gjzwfw.gov.cn) 方案 代码混淆Rsa公钥加密https协议 案例 LOFTER&#xff08;乐乎&#xff09; - 让兴趣&#xff0c;更有趣 方案 sha256https Sign in GitLab (secxun.com) 方案 不加密内网 凤凰…

mysql视图介绍(本质,修改数据时的表现,排序覆盖)

目录 视图 介绍 语法 使用 本质 修改数据 排序覆盖 视图 介绍 是一种虚拟表&#xff0c;它不存储实际的数据&#xff0c;而是基于查询结果动态生成数据 将查询结果以表结构保存视图和基表之间会互相影响 视图可以基于一张或多张表来创建&#xff0c;并且可以像普通表一样…

List、Set、数据结构、Collections

一、数据结构 1.1 常用的数据结构 栈 栈&#xff1a;stack,又称堆栈&#xff0c;它是运算受限的线性表&#xff0c;其限制是仅允许在标的一端进行插入和删除操作&#xff0c;不允许在其他任何位置进行添加、查找、删除等操作。 简单的说&#xff1a;采用该结构的集合&#…

Clickhouse笔记(二) 集群搭建

0.集群规划 操作系统使用ubuntu2204server&#xff0c;8C8G100G。 节点分片部署192.168.50.5分片1副本1clickhouse-server/clickhouse-client/keeper192.168.50.6分片1副本2clickhouse-server/clickhouse-client/keeper192.168.60.7分片2副本1clickhouse-server/clickhouse-c…

ECharts饼图-饼图纹理,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个饼图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供详…

day7:软件包管理

一&#xff0c;软件包概述 软件包概述 软件包用于安装&#xff0c;升级&#xff0c;卸载一个软件 软件包类型 二进制包 源码经过了编译&#xff08;而且成功了&#xff09;后产生的包&#xff0c;二进制包是linux下默认的安装包 编译好的文件&#xff0c;直接使用&#xff…

音质最好的麦克风有哪些?领夹麦克风哪个品牌好?麦克风十大品牌

在当下自媒体行业蓬勃发展的背景下&#xff0c;无线领夹麦克风已成为众多内容创作者不可或缺的装备。市场上的无线领夹麦克风种类繁多&#xff0c;品质参差不齐&#xff0c;价格也相差悬殊&#xff0c;这使得选购一款合适的麦克风变得颇具挑战性。许多消费者在追求性价比的过程…

无人机避障——路径规划篇(一) JPS跳点搜索算法A*算法对比

JSP 跳点搜索算法与改进 A*算法对比 一、算法概述: 跳点搜索(Jump Point Search,JPS)算法:一种用于路径规划的启发式搜索算法。它主要用于在网格地图(如游戏地图、机器人运动规划地图等)中快速找到从起点到终点的最短路径。该算法在改进 A*算法的基础上进行了优化,通过跳过一…

自由学习记录(12)

综合实践 2D的Shape&#xff0c;Tilemap都要导包的&#xff0c;编辑器也要导包&#xff0c;。。和2d沾边的可能3d都要主动导包 应该综合的去运用&#xff0c;不见得Tilemap就很万能&#xff0c;如果要做什么顶方块的有交互反应的物体&#xff0c; 那直接拖Sprite会更方便一些…

大路灯护眼灯是智商税吗?五款口碑最好的落地灯品牌分享

大路灯护眼灯是智商税吗?在当前照明灯具中&#xff0c;护眼灯大路灯并不是智商税&#xff01;护眼大路灯因其出色的灯光和舒适度效果而受到广泛欢迎。面对市场众多的护眼大路灯产品&#xff0c;选择一把优质的护眼大路灯显得尤为重要。低质量的护眼大路灯不仅性能不佳&#xf…

探索音频在线剪辑工具的奇妙世界

无论是专业的音频制作人&#xff0c;还是普通的音乐爱好者&#xff0c;都可能需要对音频进行剪辑和编辑。我比较建议从低成本的工具开始入手避免浪费&#xff0c;今天我推荐几款音频在线剪辑工具一起看看这些共苦如何打造作品吧。 1.福昕音频剪辑 教程链接&#xff1a;https:…

初学者如何学习网络安全,零基础入门到精通,收藏这一篇就够了

学习任何技术或知识前&#xff0c;需要培养好的学习习惯&#xff0c;投入时间和精力去进行钻研&#xff0c;培养兴趣和学习能力&#xff0c;并能通过搜索引擎解决问题。对于网络安全学习来说&#xff0c;要掌握学习方法&#xff0c;因为它的知识面广且复杂。 之前看到一张&quo…

初始JavaEE篇——多线程(2):join的用法、线程安全问题

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 模拟实现线程中断 join的用法 线程的状态 NEW&#xff1a; RUNNABLE&#xff1a; TIMED_WAITING&#xff1a; TERMINATED…

苍穹外卖--开发记录day11

目录 苍穹外卖day11一&#xff1a;apache-Echarts简单了解二&#xff1a;营业额统计四&#xff1a;用户统计五&#xff1a;订单统计六&#xff1a;销量排名统计 总结 苍穹外卖day11 一&#xff1a;apache-Echarts简单了解 二&#xff1a;营业额统计 外链图片转存失败,源站可能…

深入解析C++游戏开发:从基础到高级应用

目录 深入解析C游戏开发&#xff1a;从基础到高级应用 目录 为何选择C进行游戏开发 高性能与高效率 强大的内存管理 广泛的库和框架支持 丰富的社区资源 C游戏开发基础 C基础知识 面向对象编程 常用设计模式 游戏开发流程 设计与规划 选择引擎和工具 架构设计 …

Data+AI━━隐私都没了,还不懂用户画像吗?

DataAI━━隐私都没了&#xff0c;还不懂用户画像吗&#xff1f; 前言用户画像是什么&#xff1f;用户画像的应用场景DataAI下如何构建用户画像 前言 数据驱动的时代&#xff0c;用户画像已经成为商业和技术领域的热门话题。无论你在电商、金融、广告还是社交媒体&#xff0c;…