框架修改思路

news2025/4/2 21:48:35

一、组件引入基本样式

面包屑(使用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 函数,从会话存储中获取菜单数据。
     

综上所述,这段代码实现了从会话存储中获取菜单数据,根据菜单点击动态创建和切换标签页,以及路由导航的功能

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2025图像处理和深度学习国际学术会议(IPDL 2025)

重要信息 官网&#xff1a;www.IPDL.xyz 时间&#xff1a;2025年4月11-13日 地点&#xff1a;中国-成都 简介 随着深度学习和图像处理技术的迅速发展&#xff0c;相关技术的应用逐渐渗透到各个行业&#xff0c;如医疗影像分析、自动驾驶、安防监控和智能制造等。这些应用的…

使用uni-app框架 写电商商城前端h5静态网站模板项目-手机端-前端项目练习

以前用vue2 分享过一个电商商城前端静态网站项目-电脑端&#xff0c;需要的小伙伴还是很多的&#xff0c;最近又花了几天更新了一个 手机端的 电商商城h5项目&#xff0c;今天也分享一下实现方案。 对于以前写的 电商商城前端静态网站模板-电脑端&#xff0c;有兴趣的小伙伴 可…

远心镜头原理

文章目录 原理特点分类应用领域 参考&#xff1a;B站优致谱视觉 原理 远心镜头的工作原理基于其特殊的光学设计&#xff0c;旨在解决普通镜头存在的视差问题。它通过将镜头的光轴与成像面垂直&#xff0c;并使主光线平行于光轴&#xff0c;从而确保在一定的物距范围内&#xf…

centos7修复漏洞CVE-2023-38408

漏洞描述&#xff1a; CVE-2023-38408 是 OpenSSH 组件中的一个远程代码执行&#xff08;RCE&#xff09;漏洞&#xff0c;影响 OpenSSH 代理&#xff08;ssh-agent&#xff09;的安全性。该漏洞被发现于 2023 年 7 月&#xff0c;并被标记为 高危&#xff08;CVSS 评分 7.3&a…

uniapp微信小程序封装navbar组件

一、 最终效果 二、实现了功能 1、nav左侧返回icon支持自定义点击返回事件&#xff08;默认返回上一步&#xff09; 2、nav左侧支持既显示返回又显示返回首页icon 3、nav左侧只显示返回icon 4、nav左侧只显示返回首页icon 5、nav左侧自定义left插槽 6、nav中间支持title命名 7…

系统思考与心智模式

我们的生命为什么越来越长&#xff1f;因为有了疫苗&#xff0c;有了药物。可这些是怎么来的&#xff1f;是因为我们发现了细菌的存在。但在很久以前&#xff0c;医生、助产士甚至都不洗手——不是他们不负责&#xff0c;而是根本不知道“细菌”这回事。那细菌是怎么被发现的&a…

数据库--数据库设计

目录&#xff1a; 1.数据库设计和数据模型 2.概念结构设计&#xff1a;E-R模型 3.逻辑结构设计&#xff1a;从E-R图到关系设计 4.数据库规范化设计理论 5.数据库规范化设计实现 1.数据库设计和数据模型 数据库设计会影响数据库自身和上层应用的性能。 一个好的数据库设计可以提…

[Mac]利用hexo-theme-fluid美化个人博客

接上文,使用Fluid美化个人博客 文章目录 一、安装hexo-theme-fluid安装依赖指定主题创建「关于页」效果展示 二、修改个性化配置1. 修改网站设置2.修改文章路径显示3.体验分类和标签4.左上角博客名称修改5.修改背景图片6.修改关于界面 欢迎大家参观 一、安装hexo-theme-fluid 参…

黑盒测试的场景法(能对项目业务进行设计测试点)

定义: 通过运用场景来对系统的功能点或业务流程的描述&#xff0c;设计用例遍历场景&#xff0c;验证软件系统功能的正确性从而提高测试效果的一种方法。 场景法一般包含基本流和备用流。 基本流:软件功能的正确流程&#xff0c;通常一个业务只存在一个基本流且基本流有一个…

通过Anaconda Prompt激活某个虚拟环境并安装第三方库

打开 Anaconda Prompt 在Windows中&#xff0c;可以通过开始菜单搜索 Anaconda Prompt 来打开。&#xff08;红色箭头指向的地方。&#xff09; 激活虚拟环境 输入以下命令来激活您的虚拟环境&#xff08;假设虚拟环境名称为 myenv&#xff09;&#xff1a; conda activate…

全长约8.3公里!宁波象山港跨海大桥南中塔柱云端合龙

快科技3月31日消息&#xff0c;据报道&#xff0c;由中国交建二航局承建的宁波象山港跨海大桥顺利完成南中塔柱合龙施工&#xff0c;标志着这一重大交通工程取得阶段性突破。 这座连接宁波鄞州区与象山县的跨海通道全长8.3公里&#xff0c;其标志性的南主塔采用创新"钻石…

使用 2 端口探头测量 40 uOhm(2000 安培)PDN 的挑战 – 需要多少 CMRR?

部分 1 / 3 本文是 3 部分系列的第一部分&#xff1a; 第 2 部分 - 测量结果&#xff01; 第 3 部分 - 使用另一台 VNA 的测量结果 介绍 我们大多数人都知道 2 端口测量中的接地回路。我们大多数人也都知道&#xff0c;我们需要引入接地回路隔离器来纠正错误。如果没有&…

蓝桥杯——统计子矩阵

解法&#xff1a;二维前缀和双指针 代码&#xff1a; #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 …

吾爱破解安卓逆向学习笔记(4p)

学习目标&#xff0c;了解安卓四大组件&#xff0c;activity生命周期&#xff0c;同时了解去除部分广告和更新提示。 广告类型 1.启动页广告 2.更新广告 3.横幅广告 安卓四大组件 组件描述Activity(活动)在应用中的一个Activity可以用来表示一个界面&#xff0c;意思可以…

stm32第十天外部中断和NVIC讲解

一&#xff1a;外部中断基础知识 1.STM32外部中断框架 中断的概念&#xff1a;在主程序运行过程中&#xff0c;出现了特点的中断触发条件&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行 1&…

26考研——线性表_ 线性表的链式表示_单链表(2)

408答疑 文章目录 三、 线性表的链式表示单链表概念单链表的结构头结点 单链表上基本操作的实现单链表的初始化带头结点和不带头结点的初始化操作注意 求表长操作按序号查找结点按值查找表结点插入结点操作扩展&#xff1a;对某一结点进行前插操作 删除结点操作扩展&#xff1a…

MATLAB 控制系统设计与仿真 - 31

二次型最优控制 考虑到系统如果以状态空间方程的形式给出&#xff0c;其性能指标为&#xff1a; 其中F,Q,R是有设计者事先选定。线性二次最优控制问题简称LQ(Linear Quadractic)问题,就是寻找一个控制,使得系统沿着由指定初态出发的相应轨迹,其性能指标J取得最小值。 LQ问题分…

蓝桥杯15届JAVA_A组

将所有1x1转化为2x2 即1x1的方块➗4 然后计算平方数 记得-1 2 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter;public class Main{static BufferedReader in new BufferedReader(new In…

deepseek v3 0324实现工作流编辑器

HTML 工作流编辑器 以下是一个简单的工作流编辑器的HTML实现&#xff0c;包含基本的拖拽节点、连接线和可视化编辑功能&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewp…

20250331-智谱-沉思

背景 收到GLM沉思的消息&#xff0c;立马试用下。感觉真的太及时了。 &#xff08;背景&#xff1a;为了客户的需求“AI辅助写作”实验了2款开源workflow&#xff0c;2款在线workflow&#xff0c;好几款多智能体框架后&#xff0c;心中无底之际。。。&#xff09; 1. GLM(开启…