框架修改思路
一、组件引入基本样式
面包屑(使用element plus的标签页)
<!-- 标签页区域 --><el-tabs v-model="activeTab" type="card" closable @tab-remove="removeTab" class="top-tabs"><el-tab-pane :key="tab.name" :label="tab.title" :name="tab.name" v-for="tab in tabs"><div class="tab-content-placeholder">{{ tab.content }}</div></el-tab-pane></el-tabs>
菜单容器
<!-- 菜单容器 --><div class="menu-wrapper"><!-- 折叠按钮区域 --><div class="radio-group-container"><el-radio-group v-model="isCollapse" style="margin-bottom: 0;"><div :class="['icon-background', { 'collapsed': isCollapse }]"><el-icon :size="25" :color="isCollapse? 'white' : '#ffd04b'" @click="isCollapse =!isCollapse"style="margin-top: 10px;margin-left: 10px;"><component :is="isCollapse? Expand : Fold" /></el-icon></div></el-radio-group></div><!-- 主菜单区域 --><el-menu router default-active="Login" class="full-height-menu dark-menu" @open="handleOpen"@close="handleClose" :collapse="isCollapse" background-color="#001529" text-color="#bfcbd9"active-text-color="#409EFF" style="margin-top: -10px;" @select="handleMenuSelect"><template v-for="item in dynamicMenuItems" :key="item.path"><template v-if="item.children && item.children.length > 0"><el-sub-menu :index="item.path"><template #title><el-icon><component :is="item.meta.icon" v-if="item.meta.icon" /></el-icon><span>{{ item.meta.title }}</span></template><template v-for="child in item.children" :key="child.path"><el-menu-item :index="child.path"><el-icon><component :is="child.meta.icon" v-if="child.meta.icon" /></el-icon><span>{{ child.meta.title }}</span></el-menu-item></template></el-sub-menu></template><el-menu-item v-else :index="item.path"><el-icon><component :is="item.meta.icon" v-if="item.meta.icon" /></el-icon><span>{{ item.meta.title }}</span></el-menu-item></template></el-menu></div>
二.实现思路
1.导入必要的模块和组件
import { ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import {ElRadioGroup,ElMenu,ElMenuItem,ElIcon,ElSubMenu,ElTabs,ElTabPane
} from 'element-plus';
import {Expand,Fold
} from '@element-plus/icons-vue';
2. 定义响应式数据
const router = useRouter();
const isCollapse = ref(true);
const dynamicMenuItems = ref([]);
const activeTab = ref('');
const tabs = ref([]);
3. 获取本地存储的菜单数据
const getDynamicMenuItems = () => {const storedMenuPath = sessionStorage.getItem('menuPath');if (storedMenuPath) {const menuPathData = JSON.parse(storedMenuPath);dynamicMenuItems.value = menuPathData.map(item => {const menuItem = {path: item.path,meta: {title: item.name,icon: null}};if (item.children && item.children.length > 0) {menuItem.children = item.children.map(child => ({path: child.path,meta: {title: child.name,icon: null}}));}return menuItem;});}
};
4. 查找菜单项及其所有子项的完整路径
const findAllMenuPaths = (items) => {const paths = [];items.forEach(item => {paths.push(item.path);if (item.children) {paths.push(...findAllMenuPaths(item.children));}});return paths;
};
5. 菜单点击事件处理
const handleMenuSelect = (key) => {const allPaths = findAllMenuPaths(dynamicMenuItems.value);if (!allPaths.includes(key)) return;const existingTab = tabs.value.find(tab => tab.name === key);const menuItem = findMenuItemByPath(key);if (menuItem) {if (existingTab) {activeTab.value = key;} else {const newTab = {name: key,title: menuItem.meta.title,content: `${menuItem.meta.title} 内容区域`};tabs.value.push(newTab);activeTab.value = key;}// 导航到对应路由router.push(key);}
};
6. 根据路径查找菜单项
const findMenuItemByPath = (path, items = dynamicMenuItems.value) => {for (const item of items) {if (item.path === path) return item;if (item.children) {const found = findMenuItemByPath(path, item.children);if (found) return found;}}return null;
};
7. 处理标签页关闭事件
const removeTab = (targetName) => {tabs.value = tabs.value.filter(tab => tab.name !== targetName);if (activeTab.value === targetName) {activeTab.value = tabs.value.length > 0 ? tabs.value[0].name : '';}
};
8. 处理菜单展开和关闭事件
const handleOpen = (key, keyPath) => {console.log('菜单展开:', key, keyPath);
};const handleClose = (key, keyPath) => {console.log('菜单关闭:', key, keyPath);
};
9. 组件挂载后执行的操作
onMounted(() => {getDynamicMenuItems();
});
onMounted是一个生命周期钩子函数,在组件挂载后执行。- 调用
getDynamicMenuItems函数,从会话存储中获取菜单数据。
综上所述,这段代码实现了从会话存储中获取菜单数据,根据菜单点击动态创建和切换标签页,以及路由导航的功能
相关文章:
框架修改思路
一、组件引入基本样式 面包屑(使用element plus的标签页) <!-- 标签页区域 --><el-tabs v-model"activeTab" type"card" closable tab-remove"removeTab" class"top-tabs"><el-tab-pane :key&q…...
每天学一个 Linux 命令(8):ls
大家好,欢迎来到《每天掌握一个Linux命令》系列。在这个系列中,我们将逐步学习并熟练掌握Linux命令,今天,我们要学习的命令是ls。 01 什么是ls命令 在Linux系统中,ls命令是“list”的缩写,其英文全称为“list directory contents”,即“列出目录内容”。该命令非常实用…...
2025图像处理和深度学习国际学术会议(IPDL 2025)
重要信息 官网:www.IPDL.xyz 时间:2025年4月11-13日 地点:中国-成都 简介 随着深度学习和图像处理技术的迅速发展,相关技术的应用逐渐渗透到各个行业,如医疗影像分析、自动驾驶、安防监控和智能制造等。这些应用的…...
Flutter 环境搭建、常用指令、开发细节
一、环境搭建 Flutter 插件和包管理平台:pub.devFlutter 环境安装,官方中文文档,按着官方的来就够了,没啥难度。安卓模拟器可以使用 Android Studio 自带的也可以第三方的,例如:Genymotion。配置环境变量&…...
使用uni-app框架 写电商商城前端h5静态网站模板项目-手机端-前端项目练习
以前用vue2 分享过一个电商商城前端静态网站项目-电脑端,需要的小伙伴还是很多的,最近又花了几天更新了一个 手机端的 电商商城h5项目,今天也分享一下实现方案。 对于以前写的 电商商城前端静态网站模板-电脑端,有兴趣的小伙伴 可…...
远心镜头原理
文章目录 原理特点分类应用领域 参考:B站优致谱视觉 原理 远心镜头的工作原理基于其特殊的光学设计,旨在解决普通镜头存在的视差问题。它通过将镜头的光轴与成像面垂直,并使主光线平行于光轴,从而确保在一定的物距范围内…...
centos7修复漏洞CVE-2023-38408
漏洞描述: CVE-2023-38408 是 OpenSSH 组件中的一个远程代码执行(RCE)漏洞,影响 OpenSSH 代理(ssh-agent)的安全性。该漏洞被发现于 2023 年 7 月,并被标记为 高危(CVSS 评分 7.3&a…...
Scikit-learn使用指南
1. Scikit-learn 简介 定义: Scikit-learn(简称 sklearn)是基于 Python 的开源机器学习库,提供了一系列算法和工具,用于数据挖掘、数据预处理、分类、回归、聚类、模型评估等任务。特点: 基于 NumPy、SciP…...
React AJAX:深入理解与高效实践
React AJAX:深入理解与高效实践 引言 随着Web应用的日益复杂,前端开发对数据的处理需求也越来越高。React作为目前最流行的前端框架之一,其与AJAX的结合使得数据的异步获取和处理变得更为高效和便捷。本文将深入探讨React与AJAX的关系&…...
uniapp微信小程序封装navbar组件
一、 最终效果 二、实现了功能 1、nav左侧返回icon支持自定义点击返回事件(默认返回上一步) 2、nav左侧支持既显示返回又显示返回首页icon 3、nav左侧只显示返回icon 4、nav左侧只显示返回首页icon 5、nav左侧自定义left插槽 6、nav中间支持title命名 7…...
python程序进行耗时检查
是的,line_profiler 是一个非常强大的工具,可以逐行分析代码的性能。下面是详细步骤,教你如何使用 line_profiler 来标记函数并通过 kernprof 命令运行分析。 1. 安装 line_profiler 首先需要安装 line_profiler: pip install l…...
用户模块——业务校验工具AssertUtil
AssertUtil 方法的作用 在写代码时,我们经常需要检查某些条件是否满足,比如: 用户名是否已被占用? 输入的邮箱格式是否正确? 用户是否有权限执行某个操作? 一般情况下,我们可能会这样写&am…...
系统思考与心智模式
我们的生命为什么越来越长?因为有了疫苗,有了药物。可这些是怎么来的?是因为我们发现了细菌的存在。但在很久以前,医生、助产士甚至都不洗手——不是他们不负责,而是根本不知道“细菌”这回事。那细菌是怎么被发现的&a…...
【计算机视觉】OpenCV实战项目- 抖音动态小表情
OpenCV实战项目- 抖音动态小表情 替换掉当前机器的文件位置即可运行: ‘C:/Users/baixiong/.conda/envs/python37/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml’ ‘C:/Users/baixiong/.conda/envs/python37/Lib/site-packages/cv2/data/haar…...
数据库--数据库设计
目录: 1.数据库设计和数据模型 2.概念结构设计:E-R模型 3.逻辑结构设计:从E-R图到关系设计 4.数据库规范化设计理论 5.数据库规范化设计实现 1.数据库设计和数据模型 数据库设计会影响数据库自身和上层应用的性能。 一个好的数据库设计可以提…...
[Mac]利用hexo-theme-fluid美化个人博客
接上文,使用Fluid美化个人博客 文章目录 一、安装hexo-theme-fluid安装依赖指定主题创建「关于页」效果展示 二、修改个性化配置1. 修改网站设置2.修改文章路径显示3.体验分类和标签4.左上角博客名称修改5.修改背景图片6.修改关于界面 欢迎大家参观 一、安装hexo-theme-fluid 参…...
黑盒测试的场景法(能对项目业务进行设计测试点)
定义: 通过运用场景来对系统的功能点或业务流程的描述,设计用例遍历场景,验证软件系统功能的正确性从而提高测试效果的一种方法。 场景法一般包含基本流和备用流。 基本流:软件功能的正确流程,通常一个业务只存在一个基本流且基本流有一个…...
通过Anaconda Prompt激活某个虚拟环境并安装第三方库
打开 Anaconda Prompt 在Windows中,可以通过开始菜单搜索 Anaconda Prompt 来打开。(红色箭头指向的地方。) 激活虚拟环境 输入以下命令来激活您的虚拟环境(假设虚拟环境名称为 myenv): conda activate…...
SerDes(Serializer/Deserializer)详解
一、SerDes的定义与核心作用 SerDes(串行器/解串器) 是一种将 并行数据转换为高速串行数据(发送端)以及 将串行数据恢复为并行数据(接收端)的集成电路技术,用于解决高速数据传输中的时序、噪声…...
oneDNN、oneMKL 和 oneTBB 介绍及使用
1. oneDNN(Intel oneAPI Deep Neural Network Library) 简介 oneDNN 是 Intel 开源的深度学习神经网络加速库,专为 CPU 和 GPU 上的深度学习推理和训练优化。它提供高效的底层算子(如卷积、池化、矩阵乘法等)ÿ…...
目标检测的训练策略
在目标检测竞赛中,训练策略的优化是提高模型性能的关键。常用的训练策略包括数据预处理、数据增强、超参数调节、损失函数设计、正负样本采样、模型初始化和训练技巧等。以下是一些常见的训练策略: 1. 数据预处理与数据增强 数据归一化:对输…...
深入理解 YUV 颜色空间:从原理到 Android 视频渲染
在视频处理和图像渲染领域,YUV 颜色空间被广泛用于压缩和传输视频数据。然而,在实际开发过程中,很多开发者会遇到 YUV 颜色偏色 的问题,例如 画面整体偏绿。这通常与 U、V 分量的取值有关。那么,YUV 颜色是如何转换为 …...
unidbg读写跟踪还原X-Gorgon
使用版本 33.2.5 mssdk提供给 libsscronet.so 网络库的接口地址是 0x88ee0 参数签名函数调用序列 0x88ee0 -> 0x87e48 -> 0x86d60 -> 0x6B14c 0x6B14c -> 0x6Db40 -> 0x73908-> 0x7d3f0 (X-Argus) ->…...
全长约8.3公里!宁波象山港跨海大桥南中塔柱云端合龙
快科技3月31日消息,据报道,由中国交建二航局承建的宁波象山港跨海大桥顺利完成南中塔柱合龙施工,标志着这一重大交通工程取得阶段性突破。 这座连接宁波鄞州区与象山县的跨海通道全长8.3公里,其标志性的南主塔采用创新"钻石…...
使用 2 端口探头测量 40 uOhm(2000 安培)PDN 的挑战 – 需要多少 CMRR?
部分 1 / 3 本文是 3 部分系列的第一部分: 第 2 部分 - 测量结果! 第 3 部分 - 使用另一台 VNA 的测量结果 介绍 我们大多数人都知道 2 端口测量中的接地回路。我们大多数人也都知道,我们需要引入接地回路隔离器来纠正错误。如果没有&…...
蓝桥杯——统计子矩阵
解法:二维前缀和双指针 代码: #include <iostream> using namespace std; typedef long long ll; ll prefix[505][505], a[250010]; int main() {ll n, m, k, ans 0; cin >> n >> m >> k;for(int i 1; i < n; i)for(int …...
snmp/mib采用子代理模式,编码,部署(二)---多实例处理
snmp/mib采用子代理模式,编码,部署(二)---多实例处理 0.本文针对net-snmp中mib表做处理,即单张表对应后台多个实例. 1.源代码生成 拷贝GSC-MIB-0805.txt到/usr/share/snmp/mibs(具体看自己安装目录,如果找不到,下面解…...
吾爱破解安卓逆向学习笔记(4p)
学习目标,了解安卓四大组件,activity生命周期,同时了解去除部分广告和更新提示。 广告类型 1.启动页广告 2.更新广告 3.横幅广告 安卓四大组件 组件描述Activity(活动)在应用中的一个Activity可以用来表示一个界面,意思可以…...
使用Redis实现轻量级消息队列
使用消息中间件如RabbitMQ或kafka虽然好,但也给服务器带来很大的内存开销,当系统的业务量,并发量不高时,考虑到服务器和维护成本,可考虑使用Redis实现一个轻量级的消息队列,实现事件监听的效果。下面介绍下…...
stm32第十天外部中断和NVIC讲解
一:外部中断基础知识 1.STM32外部中断框架 中断的概念:在主程序运行过程中,出现了特点的中断触发条件,使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 1&…...
