vue搭建一个树形菜单项目

首先搭建项目需要先通过步骤搭建一个vue的项目,然后创建一个component文件,里面新建一个index.vue页面来。

这是引入的element-ui组件库里的组件,来实现我的路由,渲染的是我存储的动态路由,所以需要先安装并且引用。

npm install element-plus @element-plus/icons-vue

这是菜单管理的

<template><div class="sidebar-container"><!-- 折叠控制 --><div class="collapse-control" style="background-color:#293246" @click="toggleCollapse"><el-icon :size="20" :color="isCollapse ? '#fff' : '#ffd04b'"><component :is="isCollapse ? Expand : Fold" /></el-icon></div><!-- 导航菜单 --><div><el-menu router :default-active="$route.path" background-color="#293246" text-color="#fff" style="height: 100vh"active-text-color="#ffd04b" :collapse="isCollapse"><template v-for="menu in menuArray" :key="menu.path"><!-- 有子级的多层菜单项 --><el-sub-menu v-if="menu.children?.length" index="/layout"><template #title><span>{{ menu.meta.title }}</span></template><el-menu-item v-for="sub in menu.children" :key="'/layout' + sub.path" :index="'/layout' + sub.path"><span>{{ sub.title }}</span></el-menu-item></el-sub-menu><!-- 没子级的单层菜单项 --><el-menu-item v-else :index="menu.path == '/home' ? menu.path : menu.path"><span>{{ menu.meta.title }}</span></el-menu-item></template></el-menu></div></div>
</template>
<script setup>
import { ref } from 'vue'
import { Expand, Fold } from '@element-plus/icons-vue'
const isCollapse = ref(false)
const toggleCollapse = () => {isCollapse.value = !isCollapse.value
}
const menuArray = ref([]);
render();//初始化渲染
function render() {try {const menuList = JSON.parse(sessionStorage.getItem('menuPath') || '[]');const menuName = JSON.parse(sessionStorage.getItem('menuName') || '[]');console.log(menuList, menuName);if (!Array.isArray(menuList) || !Array.isArray(menuName)) {throw new Error('存储数据格式不正确');}const nameMap = new Map(menuName.map(item => [item.name, item]));menuArray.value = menuList.filter(item => item?.name && nameMap.has(item.name)).map(item => ({...item,...nameMap.get(item.name)}));console.log('安全筛选结果:', menuArray.value);} catch (error) {console.error('数据处理失败:', error);// 可以在这里设置默认值或进行错误上报return [];}
}
</script>
<style scoped>
.sidebar-container {transition: width 0.3s;
}.collapse-control {padding: 15px;cursor: pointer;border-bottom: 1px solid #1f2d3d;
}.el-menu--collapse {width: 64px;
}.el-menu-vertical-demo:not(.el-menu--collapse) {width: 200px;
}
</style>

组件面包屑

<template><!-- <div style="margin-bottom: 20px;width: 100%;"><el-button size="small" @click="addTab(editableTabsValue)">添加标签页</el-button></div> --><el-tabs v-model="editableTabsValue" @tab-click="tabBread" type="card" @tab-remove="removeTab"><el-tab-pane v-for="item in editableTabs" :key="item.name" :label="item.title":name="item.name" :closable="item.name !== '/home'"><!-- 主页面 --><el-main><router-view /></el-main></el-tab-pane></el-tabs>
</template><script setup>
import { ref, reactive, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';const route = useRoute();
const router = useRouter();const editableTabsValue = ref(route.path);
const editableTabs = reactive([{ title: '首页', name: '/home' }
]);// 监听路由变化,同步标签页
watch(() => route.path,(newPath) => {editableTabsValue.value = newPath;if (!editableTabs.some(tab => tab.name === newPath)) {const title = getTitleFromPath(newPath);editableTabs.push({ title, name: newPath });}},{ immediate: true }
);function getTitleFromPath(path) {const titleMap = {'/home': '首页','/layout/user/list': '用户列表','/layout/user/role': '角色列表',// 扩展其他路由...};return titleMap[path] || '新标签';
}
// 点击面包屑标签跳转路由
const tabBread = () => {console.log(editableTabsValue.value);router.push(editableTabsValue.value);
}
const removeTab = (targetName) => {const tabs = editableTabs;let activeName = editableTabsValue.value;if (activeName === targetName) {const currentIndex = tabs.findIndex(tab => tab.name === targetName);const nextTab = tabs[currentIndex + 1] || tabs[currentIndex - 1];activeName = nextTab?.name || '/home';router.push(activeName);}editableTabsValue.value = activeName;editableTabs.splice(0, editableTabs.length, ...tabs.filter(tab => tab.name !== targetName));
};
</script><style scoped>
/* 可以添加自定义样式 */
.el-tabs {margin: 20px;
}
</style>

这部分代码是用来布局菜单框架结构的,然后我们在路由部分引入这个文件的路由即可。

<!-- src/layouts/MainLayout.vue -->
<template><div class="app"><el-container style="height: 100vh;"><!-- 左侧导航栏 --><el-aside width="200px"><aside-nav /></el-aside><div class="menu"><!-- 顶部菜单 --><MyHeader /></div></el-container></div>
</template><script>
import MyHeader from '@/Layout/topHeader.vue'
import AsideNav from '@/components/MenuItem.vue'export default {components: {MyHeader,AsideNav}
}
</script><style>
html,
body {padding: 0;margin: 0;
}.menu {width: 100%;
}
</style>

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

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

相关文章

【数据结构】[特殊字符] 并查集优化全解:从链式退化到近O(1)的性能飞跃 | 路径压缩与合并策略深度实战

并查集的优化 导读一、合并优化1.1 基本原理1.2 按大小合并1.3 按秩合并1.4 两种合并的区别**1.4.1 核心目标****1.4.2 数据存储****1.4.3 合并逻辑****1.4.4 树高控制****1.4.5 适用场景****1.4.6 路径压缩兼容性****1.4.7 极端案例对比****1.4.8 小结**二、查找优化2.1 路径压…

[python]基于yolov12实现热力图可视化支持图像视频和摄像头检测

YOLOv12 Grad-CAM 可视化工具 本工具基于YOLOv12模型&#xff0c;结合Grad-CAM技术实现目标检测的可视化分析&#xff0c;支持图像、视频和实时摄像头处理。 注意 该项目使用的是yolov12-1.0模型进行测试通过&#xff0c;不是使用turbo模型&#xff0c;且由于yolov12-1.0由于…

进程Kill杀死后GPU显存没有释放仍然被占用,怎么杀死僵尸进程

参考链接&#xff1a; https://blog.csdn.net/qq_37591986/article/details/131118109 使用下面的命令&#xff1a; fuser -v /dev/nvidia0 | awk {print $0} | xargs kill -9一般来说他会杀掉整个用户的所有进程。

基于飞腾/龙芯+盛科CTC7132全国产交换机解决方案

产品介绍 盛科CTC7132,内置ARM-Cortex A53 主频1.2GHz&#xff1b;支持24个千兆电口&#xff0c;24个万兆光口&#xff08;850nm多模&#xff09;&#xff0c;1个千兆管理网口&#xff0c;1个管理串口&#xff1b;支持1个百兆健康管理网口&#xff1a;用于设备端口状态、电压、…

Tesseract OCR技术初探(Python调用)

一、Tesseract OCR技术解析 1.1 核心架构与发展历程 Tesseract是由HP实验室于1985年研发的光学字符识别引擎&#xff0c;2005年由Google开源并持续维护至今。其核心技术经历了三个阶段演进&#xff1a; 传统模式&#xff08;v3.x&#xff09;&#xff1a;基于特征匹配算法&a…

自动语音识别(ASR)技术详解

语音识别&#xff08;Automatic Speech Recognition, ASR&#xff09;是人工智能和自然语言处理领域的重要技术&#xff0c;旨在将人类的语音信号转换为对应的文本。近年来&#xff0c;深度学习的突破推动语音识别系统从实验室走入日常生活&#xff0c;为智能助手、实时翻译、医…

Cursor 汉化教程

# 问题 想把 cursor 改成中文 我这里是汉化过的 # 【第一种方法】安装插件 然后重启 # 【第二种方法】Ctrl Shift P 打开配置项 然后搜索输入 Configure Display Language 点一下 切换到 zh-cn 重启 cursor 即可 重启后就好了~

用 pytorch 从零开始创建大语言模型(三):编码注意力机制

从零开始创建大语言模型&#xff08;Python/pytorch &#xff09;&#xff08;三&#xff09;&#xff1a;编码注意力机制 3 编码注意力机制3.1 建模长序列的问题3.2 使用注意力机制捕捉数据依赖关系3.3 通过自注意力关注输入的不同部分3.3.1 一个没有可训练权重的简化自注意力…

Linux之基础知识

目录 一、环境准备 1.1、常规登录 1.2、免密登录 二、Linux基本指令 2.1、ls命令 2.2、pwd命令 2.3、cd命令 2.4、touch命令 2.5、mkdir命令 2.6、rmdir和rm命令 2.7man命令 2.8、cp命令 2.9、mv命令 2.10、cat命令 2.11、echo命令 2.11.1、Ctrl r 快捷键 2…

Java学习------源码解析之StringBuilder

1. 介绍 String中还有两个常用的类&#xff0c;StringBuffer和StringBuilder。这两个类都是专门为频繁进行拼接字符串而准备的。最先出现的是StringBuffer&#xff0c;之后到jdk1.5的时候才有了StringBuilder。 2. StringBuilder解析 从这张继承结构图可以看出&#xff1a; S…

数据化管理(一)---什么是数据化管理

目录 一、什么是数据化管理1.1 “聪明”的销售人员1.2 数据化管理的概念1.3 数据化管理的意义1.4 数据化管理的四个层次1.4.1 业务指导管理1.4.2 营运指导管理1.4.3 经营策略管理1.4.4 战略规划管理 1.5 数据化管理流程图1.5.1 分析需求1.5.2 收集数据1.5.3 整理数据1.5.4 分析…

笔记本电脑更换主板后出现2203:System configuration is invalid,以及2201、2202系统错误的解决

笔记本电脑更换主板后启动出现2203:System configuration is invalid,以及2201、2202系统错误的解决 自用的一台ThinkpadT490笔记本电脑 ,由于主板故障,不得不更换主板,通过某宝购置主板后进行了更换。 具体拆卸笔记本可搜索网络视频教程。 注意: 在更换主板时,注意先拍…

微型导轨和普通导轨有哪些区别?

微型导轨和普通导轨都是常用的工业机械传动装置&#xff0c;目前&#xff0c;市场上有各种各样的导轨产品。那么微型导轨和普通导轨有哪些区别呢&#xff1f; 1、尺寸&#xff1a;微型导轨尺寸较小&#xff0c;滑座宽度最小可达 8MM&#xff0c;长度最小可达 11MM 左右&#xf…

GMP调度模型

Golang调度器的由来 1.协程提高CPU利用率 线程分为用户态和内核态&#xff1b;协程其实就是用户态的线程。 协程和线程的映射关系 N:1关系 N个协程绑定一个线程&#xff0c;优点就是协程在用户态线程即完成切换&#xff0c;不会陷入到内核态&#xff0c;这种切换非常轻量快速…

jetson orin nano super AI模型部署之路(三)stable diffusion部署

先看一下部署后的界面和生成的图片。 在jetson orin nano super上部署stable diffusion比较简单&#xff0c;有现成的docker image和代码可用。 docker image拉取 使用的docker image是dustynv/stable-diffusion-webui&#xff0c;对于jetson orin nano super的jetpack6.2来说…

react如何引用(按需加载)百度地图,并结合and组件化封装

1.技术选项: vitereactantdesign load-script 2.实现思路&#xff1a; 1.按需加载如何实现? 要实现按需加载就不能直接在项目的入口文件这种地方去通过script标签引入&#xff0c;这里使用load-script封装了一个加载百度地图的Bmap.js方法,实现动态的插入script脚本。 根…

Java虚拟机(JVM)详解

Java虚拟机&#xff08;JVM&#xff09;详解 JVM内存结构垃圾收集算法标记-清除 算法复制 算法标记 - 整理 算法分代收集算法 类加载类加载过程加载器类型双亲委派模型 Java对象如何判断存活引用计数法可达性分析法 方法分派模型静态分派动态分派 JVM内存结构 方法区&#xff1…

AI知识补全(八):多模态大模型是什么?

名人说&#xff1a;人生如逆旅&#xff0c;我亦是行人。 ——苏轼《临江仙送钱穆父》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;AI知识补全&#xff08;七&#xff09;&#xff1a;AI Agent 智能…

从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换

从 Word 到 HTML&#xff1a;使用 Aspose.Words 轻松实现 Word 文档的高保真转换 前言一、环境准备二、核心代码实现1. 将 Word 转换为 HTML 文件流2. 优化超链接样式 三、测试效果四、总结 前言 在日常开发中&#xff0c;我们经常需要将 Word 文档转换为 HTML&#xff0c;用于…

观察者模式:解耦对象间的依赖关系

观察者模式&#xff1a;解耦对象间的依赖关系 JDK 中曾直接提供对观察者模式的支持&#xff0c;但因其设计局限性&#xff0c;现已被标记为“过时”&#xff08;Deprecated&#xff09;。不过&#xff0c;观察者模式的思想在 JDK 的事件处理、spring框架等仍有广泛应用。下面我…