当前位置: 首页 > news >正文

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>

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

相关文章:

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

基于vue-element-admin的顶部一级导航栏的调整&#xff0c;因为一级路由过多导致其他元素被挤到第二行&#xff0c;故现在将原来一级路由数组拆分成两个数组&#xff0c;第二个数组以子菜单显示 关键处调整代码 html <el-menu:active-text-color"variables.menuActiv…...

微信小程序 setData数据量过大的解决与分页加载的实现

我们经常使用setData方法来修改数据&#xff0c;从而达到更新页面的目的。但是当我们通过setData方法设置的数据过大时就会报如下错误。 vdSyncBatch 数据传输长度为 2260792 已经超过最大长度 1048576这是因为setData设置的数据量是有限制的&#xff0c;单次设置的数据大小不…...

体育动画直播嵌入方式以及作用

什么是体育动画直播&#xff1f; 体育动画直播是通过动画技术和实时数据&#xff0c;将体育赛事的进程以动态的方式展现出来。这种形式不仅可以实时呈现比赛的关键时刻&#xff0c;还能够将数据和信息以更生动、有趣的方式传达给观众。比如&#xff0c;在一场足球比赛中&#…...

腾讯云轻量服务器Lighthouse的前世今生

目录 序一、名字的由来二、Lighthouse的定位是什么&#xff0c;与CVM的差异化有哪些三、Lighthouse是如何实现简单易用的四、Lighthouse对于开发者有哪些具体的利好 序 印象中&#xff0c;腾讯云轻量应用服务器Lighthouse是在2020年正式上线的。 在其一经推出后&#xff0c;就…...

java实现redis的消息发送和消费,类似kafka功能

确保在 pom.xml 中添加了 Spring Data Redis 和 Jedis 的依赖。如下所示&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency&g…...

【软件设计】常用设计模式--代理模式

文章目录 代理模式&#xff08;Proxy Pattern&#xff09;1. 概念2. 模式结构3. UML 类图4.实现方式C# 示例步骤1&#xff1a;定义主题接口步骤2&#xff1a;实现真实主题步骤3&#xff1a;实现代理类步骤4&#xff1a;客户端使用代理模式输出结果&#xff1a; Java 示例步骤1&…...

生命与自由,抑郁的来源

在中国文学史上&#xff0c;有一句极其伟大的话&#xff0c;它点出了所有人痛苦的根源。它出自《我与地坛》&#xff0c;太阳它每时每刻即是夕阳也都是旭日&#xff0c;当他从这一段熄灭着走下山去&#xff0c;收尽苍凉参照之际&#xff0c;也正是它在另一端燃烧着爬上山巅布散…...

CTFHUB技能树之文件上传——双写后缀

开启靶场&#xff0c;打开链接&#xff1a; 直接指明是双写绕过方法 上传06shaungxie.php&#xff0c;内容如下&#xff1a; 这一步其实最好换成.png或者.jpg或者.gif这三个符合文件格式的要求后缀 用burp抓包改包&#xff1a; 将php改成pphphp后再“Forward”&#xff1a; 上传…...

SpringBoot整合HTTPS

文章目录 1_Https 的作用2_获取证书3_配置项4_配置类5_控制类6_启动类 1_Https 的作用 保护用户的隐私信息安全&#xff1a; 在 HTTP 网站数据以明文方式传输&#xff0c;客户的隐私极容易被盗取和泄露&#xff0c;而部署 SSL 证书&#xff0c;数据以 HTTPS 加密传输&#xf…...

LVGL-从入门到熟练使用

LVGL简介 LVGL&#xff08; Light and Versatile Graphics Library &#xff09;是一个轻量、多功能的开源图形库。 1、丰富且强大的模块化图形组件&#xff1a;按钮 、图表 、列表、滑动条、图片等 2、高级的图形引擎&#xff1a;动画、抗锯齿、透明度、平滑滚动、图层混合等…...

【MySQL数据库】MySQL读写分离

文章目录 读写分离概念读写分离的动机读写分离的适用场景主从复制与读写分离MySQL 读写分离原理MySQL读写分离的实现方式代表性程序 MySQL读写分离实验搭建 MySQL 读写分离Amoeba 服务器配置测试读写分离 问答 读写分离 概念 读写分离是为了优化数据库性能&#xff0c;通过将…...

深度学习:简单计算图的反向传播传递导数计算

问题&#xff1a; 太郎在超市买了2个100日元一个的苹果&#xff0c;消费税是10%&#xff0c;请计算支付金额。 反向传播使用与正方向相反的箭头&#xff08;粗线&#xff09;表示。反向传播传递“局部导数”&#xff0c;将导数的值写在箭头的下方。在这个例子中&#xff0c;反向…...

学习AJAX请求(初步)24.10.21-10.23

1.AJAX概念 AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部分网页内容。 虽然所有的AJAX请求都是HTTP请求&#xff0c;但并非所有的HT…...

初识算法——二分查找

1.概念 二分查找算法也称折半查找&#xff0c;是一种非常高效的工作于有序数组的查找算法。 需求&#xff1a;在有序数组 A A A 内&#xff0c;查找值 t a r g e t target target 如果找到返回索引如果找不到返回 − 1 -1 −1 前提给定一个内含 n n n 个元素的有序数组…...

深入剖析 Java Spring 中的 @Autowired、@Resource、@Qualifier、@Inject 注解:使用详解与注意事项

文章目录 Autowired&#xff1a;Spring 最常用的注解1. 作用与简介2. 使用示例3. 注意事项 Resource&#xff1a;按名称注入的利器1. 作用与简介2. 使用示例3. 注意事项 Qualifier&#xff1a;解决多 bean 注入问题1. 作用与简介2. 使用示例3. 注意事项 Inject&#xff1a;标准…...

ThingsBoard规则链节点:Delete Attributes节点详解

引言 删除属性节点简介 用法 含义 应用场景 实际项目运用示例 智能家居安全系统 物流跟踪解决方案 工业自动化生产线 结论 引言 ThingsBoard是一个开源的物联网平台&#xff0c;它提供了设备管理、数据收集与处理以及实时监控等功能。其中&#xff0c;规则引擎是其核心…...

关于作为面试官以及如何准备面试的一些心得

关于作为面试官以及如何准备面试的一些心得 一、面试官&#xff08;我站在前端角度来说&#xff09; 当作为这样身份的时候&#xff0c;我想第一步应该是自己梳理一些从简到难、从点到面的问题 CSS - JS - 框架 - 项目 从这四个角度出发&#xff0c;一步一步的引导面试者的思…...

Bean对象 和 普通对象 的区别

Bean对象 和 普通对象 的区别 前言Bean的概念与new创建的对象的区别Spring Bean的优势两者使用的关键点总结 前言 在Spring框架中&#xff0c;我们通常将Spring容器管理的对象称为“Bean”或“Bean对象”。而通过new关键字创建的对象则被称为“对象”或“普通对象”。 Bean的…...

lego-loam featureAssociation 源码注释(二)

咱们接着往下看initializationValue();&#xff01;&#xff01;&#xff01; FeatureAssociation():nh("~"){subLaserCloud nh.subscribe<sensor_msgs::PointCloud2>("/segmented_cloud", 1, &FeatureAssociation::laserCloudHandler, this);s…...

Claude 3.5 的六大应用场景

Claude 3.5 的六大应用场景 随着人工智能技术的飞速发展&#xff0c;Claude 3.5 已经成为一款强大的语言模型工具&#xff0c;在多个领域展现了其卓越的应用潜力。本文将通过CSDN格式&#xff0c;介绍Claude 3.5在六大主要领域的实际应用场景&#xff0c;帮助开发者和企业更好…...

AP431比较器应用设计与动态响应优化

1. AP431作为比较器的设计背景与特性解析在模拟电路设计中&#xff0c;电压基准源和比较器是两个最基础的构建模块。AP431作为行业标准431系列的一员&#xff0c;最初的设计定位是精密电压基准源&#xff0c;用于替代传统齐纳二极管。其核心价值在于内部集成了一个高精度2.5V带…...

Python语法进阶篇 --- 单例模式、魔法方法

Python语法进阶篇 --- 单例模式、魔法方法前置补充内容单例模式魔法方法&#x1f439;&#x1f439;&#x1f439;&#x1f439;&#x1f439;一只正在努力学习计算机技术的小仓鼠&#x1f439;&#x1f439;&#x1f439;&#x1f439;&#x1f439; 前置补充内容 一个对象的实…...

科研绘图避坑指南:手把手教你用Cytoscape处理String PPI数据(TSV文件导入、节点筛选与双环图制作)

科研绘图避坑指南&#xff1a;Cytoscape实战PPI网络分析与双环图设计 在生物医学研究中&#xff0c;蛋白互作网络(PPI)可视化是揭示分子机制的重要工具。许多研究者在使用String数据库和Cytoscape软件时会遇到数据导入失败、节点筛选困难、图形美化耗时等问题。本文将针对这些痛…...

思源宋体CN终极指南:7种字重免费商用中文字体快速上手完整教程

思源宋体CN终极指南&#xff1a;7种字重免费商用中文字体快速上手完整教程 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业项目中文字体版权问题而烦恼吗&#xff1f;思源宋…...

OpenGL 调试方式

调试手段总览 API 级错误检查&#xff1a;glGetError、断言、包装宏调试输出机制&#xff1a;GL_KHR_debug、glDebugMessageCallback、QOpenGLDebugLogger着色器与程序调试&#xff1a;编译/链接日志、离线编译器、颜色编码调试渲染结果调试&#xff1a;FBO 检查、glReadPixels…...

LLM赋能网页抓取:基于ChatGPT的智能数据提取实战指南

1. 项目概述与核心价值最近在数据采集和自动化领域&#xff0c;一个名为“oxylabs/chatgpt-web-scraping”的项目引起了我的注意。乍一看&#xff0c;这像是把两个热门概念——大型语言模型&#xff08;LLM&#xff09;和网页抓取&#xff08;Web Scraping&#xff09;——强行…...

基于Claude API构建本地化智能对话应用栈:从架构设计到生产部署

1. 项目概述与核心价值最近在尝试构建一个基于Claude API的本地化应用栈时&#xff0c;我发现了dtannen的claude-stacks项目。这本质上不是一个单一的应用程序&#xff0c;而是一个精心设计的、模块化的技术栈蓝图。它旨在为开发者提供一个快速启动和运行Claude API应用的完整解…...

构建个人技能图谱:从GitHub项目到结构化能力管理实践

1. 项目概述&#xff1a;一个技能图谱的构建与价值 最近在整理自己的技术栈时&#xff0c;发现了一个挺有意思的GitHub项目&#xff0c;标题是“headlike-oradexon12/skills”。乍一看&#xff0c;这像是一个个人技能仓库&#xff0c;但深入探究后&#xff0c;我发现它远不止是…...

AI智能体信用评分系统:构建可评估、可管理的多智能体协作框架

1. 项目概述&#xff1a;一个为AI智能体设计的信用评分系统最近在折腾AI智能体&#xff08;Agent&#xff09;的落地应用时&#xff0c;我遇到了一个挺有意思的问题&#xff1a;当多个智能体协同工作&#xff0c;或者一个智能体需要调用外部工具、API时&#xff0c;如何评估和追…...

深度解析Digital-Infrastructure:一套全面的数字化基础设施建设知识体系与实践指南

深度解析Digital-Infrastructure&#xff1a;一套全面的数字化基础设施建设知识体系与实践指南 项目概述 Digital-Infrastructure 是一个专注于“数字化基础设施”领域的开源知识库项目。它并非一个具体的软件代码库&#xff0c;而是一个集理论、架构、技术选型、实施路径于一体…...