6.2 el-menu

一、 <el-menu>: 菜单组件,定义了侧边栏内部的具体导航项、层级结构和交互行为

<el-container><!-- 侧边栏容器 --><el-aside width="200px"><!-- 菜单内容 --><el-menu default-active="1" class="el-menu-vertical-demo"><el-menu-item index="1"><i class="el-icon-menu"></i><span slot="title">导航一</span></el-menu-item><el-submenu index="2"><template slot="title"><i class="el-icon-location"></i><span>导航二</span></template><el-menu-item index="2-1">选项1</el-menu-item><el-menu-item index="2-2">选项2</el-menu-item></el-submenu></el-menu></el-aside><el-main>主内容区</el-main>
</el-container>

二、 <el-aside> 详解

<el-aside> 是布局系统的一部分,用于定义侧边栏区域。

  • 作用: 提供一个固定宽度(或百分比)的垂直区域,通常放置导航菜单。
  • 关键属性:
    • width核心属性,设置侧边栏的宽度。可以是固定值 (200px) 或百分比 (20%)。这是控制侧边栏大小的主要方式。
  • 与 <el-menu> 的关系: <el-aside> 只负责“这块区域有多大”,具体的菜单样式和行为由 <el-menu> 控制。你可以给 <el-menu> 添加 height: 100% 来让它填满 <el-aside> 的高度。

三、 <el-menu> 详解 (侧边栏的核心)

<el-menu> 是构建侧边栏功能的绝对核心。它非常强大,支持多种模式和丰富的配置。

1. 基本结构
  • <el-menu>: 根菜单容器。
  • <el-menu-item>: 单个菜单项,代表一个可点击的导航链接。
  • <el-submenu>: 子菜单容器,用于创建可展开/折叠的二级(或更多级)菜单。
2. 关键属性
属性类型说明重要性
modestring菜单展示模式。horizontal (水平) / vertical (垂直) / popmenu (弹出菜单,常用于移动端)。侧边栏必须设置为 vertical⭐⭐⭐⭐⭐
default-activestring当前激活菜单的 index。用于高亮显示当前页面对应的菜单项。通常与 Vue Router 的 $route.path 或 route.meta.activeMenu 结合使用。⭐⭐⭐⭐⭐
unique-openedboolean在 mode="vertical" 时是否只保持一个子菜单展开。true 表示手风琴效果,一次只展开一个。⭐⭐⭐⭐
menu-triggerstring子菜单打开的触发方式,仅在 mode="horizontal" 时有效。hover / click
collapseboolean是否水平折叠收起菜单(仅在 mode="vertical" 时可用)。true 时菜单收起为图标。这是实现“收起/展开”侧边栏功能的关键。⭐⭐⭐⭐⭐
collapse-transitionboolean是否开启折叠动画。⭐⭐
background-colorstring菜单的背景色。⭐⭐
text-colorstring菜单的文字颜色。⭐⭐
active-text-colorstring当前激活菜单的文字颜色。⭐⭐⭐
3. <el-menu-item> 和 <el-submenu> 属性
属性类型说明
indexstring唯一标识符。对于 <el-menu-item>,点击后会触发 select 事件并传递此 index。对于 <el-submenu>,是其唯一标识,用于控制展开/收起和 unique-opened 逻辑。必须全局唯一
routeobject | stringVue Router 的 route 对象或字符串。如果提供了此属性,当点击 <el-menu-item> 时,会触发 router.push 进行导航。这是实现菜单与路由联动的便捷方式。
disabledboolean是否禁用。
4. 插槽 (Slots)
  • <el-menu-item> 的 title 插槽: 用于自定义菜单项的标题内容(通常包含图标和文字)。
    <el-menu-item index="1"><i class="el-icon-document"></i><span slot="title">处理中心</span>
    </el-menu-item>
  • <el-submenu> 的 title 插槽 (通过 template): 用于自定义子菜单的标题内容。
    <el-submenu index="2"><template slot="title"><i class="el-icon-location"></i><span>导航二</span></template><!-- 子菜单项 -->
    </el-submenu>
5. 事件 (Events)
  • select: 当菜单项被选中时触发。回调参数为 (index, indexPath),其中 indexPath 是从根节点到当前节点的 index 路径数组。这是实现菜单点击逻辑(如路由跳转、状态更新)的主要事件。
  • open: 当子菜单打开时触发。回调参数为 (index, indexPath)
  • close: 当子菜单关闭时触发。回调参数为 (index, indexPath)

四、 实现高级功能

1. 与 Vue Router 深度集成

这是最常见的需求。目标是:点击菜单项跳转路由,且当前页面对应的菜单项自动高亮

<template><el-menu:default-active="$route.path" <!-- 关键1:绑定当前路由 -->mode="vertical"@select="handleSelect" <!-- 监听 select 事件 -->><el-menu-item index="/home"><i class="el-icon-menu"></i><span slot="title">首页</span></el-menu-item><el-menu-item index="/user"><i class="el-icon-user"></i><span slot="title">用户管理</span></el-menu-item><!-- 或者使用 route 属性 (更简洁) --><!-- <el-menu-item index="/order" :route="{ path: '/order' }"> --><!--   <i class="el-icon-tickets"></i> --><!--   <span slot="title">订单管理</span> --><!-- </el-menu-item> --></el-menu>
</template><script>
export default {watch: {// 关键2:监听路由变化,更新 default-active// 因为 default-active 是 prop,直接修改 $route.path 不会自动更新// 所以通常不需要额外 watch,只要 :default-active 绑定到 $route.path 就行了// 但如果菜单 index 和路由 path 不完全一致,就需要在这里处理映射'$route'(to) {// this.activeIndex = this.getMenuIndexByRoute(to); // 自定义映射逻辑}},methods: {handleSelect(index, indexPath) {// 关键3:处理点击// 如果没有使用 :route,需要手动跳转if (index !== this.$route.path) {this.$router.push(index);}}}
}
</script>
2. 实现“收起/展开”侧边栏

利用 <el-menu>collapse 属性。

<template><div><!-- 收起/展开按钮 --><el-button @click="toggleCollapse">切换</el-button><el-aside :width="isCollapse ? '65px' : '200px'"> <!-- 动态改变 aside 宽度 --><el-menu:collapse="isCollapse" <!-- 绑定 collapse 状态 -->:collapse-transition="false" <!-- 可选:关闭动画更流畅 -->:default-active="$route.path"mode="vertical"><el-menu-item index="/home"><i class="el-icon-menu"></i><!-- 收起时只显示图标,展开时显示图标和文字 --><span slot="title" v-if="!isCollapse">首页</span></el-menu-item><!-- 其他菜单项... --></el-menu></el-aside></div>
</template><script>
export default {data() {return {isCollapse: false // 控制收起状态};},methods: {toggleCollapse() {this.isCollapse = !this.isCollapse;}}
}
</script>
3. 动态生成菜单 (基于数据)

从后端获取菜单数据,然后用 v-for 动态渲染。

<template><el-menu :default-active="activeIndex" mode="vertical"><template v-for="item in menuData"><el-menu-item v-if="!item.children" :key="item.index" :index="item.index":route="item.route"><i :class="item.icon"></i><span slot="title">{{ item.title }}</span></el-menu-item><el-submenu v-else :key="item.index" :index="item.index"><template slot="title"><i :class="item.icon"></i><span>{{ item.title }}</span></template><el-menu-item v-for="child in item.children" :key="child.index" :index="child.index":route="child.route">{{ child.title }}</el-menu-item></el-submenu></template></el-menu>
</template><script>
export default {data() {return {activeIndex: '/home',menuData: [{index: '1',title: '首页',icon: 'el-icon-menu',route: { path: '/home' }},{index: '2',title: '用户管理',icon: 'el-icon-user',children: [{ index: '2-1', title: '用户列表', route: { path: '/user/list' } },{ index: '2-2', title: '用户详情', route: { path: '/user/detail' } }]}]};}
}
</script>
4. 自定义主题

通过 background-color, text-color, active-text-color 属性或覆盖 CSS 变量来自定义侧边栏颜色。

<el-menubackground-color="#545c64"text-color="#fff"active-text-color="#ffd04b"...
><!-- 菜单项 -->
</el-menu>

或者通过 CSS 变量(如果 Element UI 版本支持):

/* 全局覆盖 */
.el-menu {--el-menu-bg-color: #545c64;--el-menu-text-color: #fff;--el-menu-active-color: #ffd04b;
}

五、 最佳实践与注意事项

  1. index 唯一性: 确保所有 <el-menu-item> 和 <el-submenu> 的 index 值在整个菜单树中是唯一的,否则 default-active 和 unique-opened 可能会出错。
  2. 路由联动: 优先使用 <el-menu-item> 的 route 属性来实现路由跳转,代码更简洁。如果逻辑复杂,再使用 @select 事件。
  3. 高亮精准: default-active 的值必须与 $route.path 完全匹配才能高亮。注意路由的 path 是否包含参数或是否是嵌套路由。必要时进行映射。
  4. 性能: 对于非常深或非常宽的菜单,考虑虚拟滚动或懒加载,但 Element UI 默认的 <el-menu> 对于一般后台系统性能足够。
  5. 无障碍: 确保菜单项有清晰的文本标签(<span slot="title">),方便屏幕阅读器识别。
  6. 响应式: 在移动端,考虑使用 <el-menu mode="popmenu"> 或将侧边栏改为可滑动的抽屉 (<el-drawer>)。

总结

Element UI 的侧边栏通过 <el-aside><el-menu> 的完美组合,提供了构建现代化后台导航的强大能力。掌握 <el-menu> 的各种属性、事件和与 Vue Router 的集成方式,是开发高效、用户体验良好的后台管理系统的关键。通过动态数据和收起/展开功能,可以构建出既美观又实用的侧边栏导航。

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

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

相关文章

Windows 笔记本实现仅关屏仍工作:一种更便捷的 “伪熄屏” 方案

在使用 Windows 笔记本作为临时服务器或需要后台持续运行程序时&#xff0c;我们常面临一个需求&#xff1a;关闭屏幕以节省电量或减少光污染&#xff0c;同时保持系统正常工作。然而&#xff0c;网络上流传的诸多方法往往存在局限&#xff0c;要么无法兼顾 “熄屏” 与 “工作…

Linux应急响应一般思路(二)

进程排查进程(Process)是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础无论是在Windows系统还是Linux系统中&#xff0c;主机在感染恶意程序后&#xff0c;恶意程序都会启动相应的进程&#x…

基于 SkyWalking + Elasticsearch + Grafana 的可落地调用链监控方案

这个方案成熟稳定、社区活跃、部署相对简单,非常适合中小型团队作为第一代调用链系统落地。 一、核心组件选型与角色 组件 版本建议 角色 优点 Apache SkyWalking v9.x+ 核心平台 (采集、分析、存储、UI) 国产优秀,Java Agent无侵入接入,功能全面,性能损耗低 Elasticsearc…

APP逆向——某站device-id参数

免责声明本博客所涉及的 爬虫技术、逆向分析方法 仅用于 学习、研究和技术交流。文中所有示例代码、工具和方法&#xff0c;均不得用于以下行为&#xff1a;未经授权的数据采集侵犯他人知识产权干扰或破坏正常业务系统任何违反国家法律法规的行为因读者将本教程内容用于 非法用…

C/C++数据结构之循环链表

概述循环链表本质上也是一个单向或双向链表&#xff0c;但其最后一个节点的指针并不指向NULL&#xff0c;而是指向链表的第一个节点&#xff0c;从而形成一个闭合的环。这种结构使得在遍历链表时&#xff0c;可以从任意一个节点开始&#xff0c;并最终回到起始点。音乐播放软件…

Mongodb的教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、mongodb是什么&#xff1f; 二、mongodb的下载与安装教程 三、mongodb的常见操作 总结 前言 在当今数据驱动的世界中&#xff0c;数据库技术是构建高效…

MySQL视图有什么用?一文读懂虚拟表的六大核心价值

引言 在数据库开发中&#xff0c;你是否遇到过这样的困境&#xff1a;业务人员需要查看复杂关联数据却难以理解多表JOIN&#xff0c;或需要限制某些用户只能访问特定字段&#xff1f;MySQL视图正是为此设计的"数据透视镜"。本文将通过官方定义、典型场景和最佳实践&a…

ubuntu24.04 frps服务器端自动启动设置【2025-08-20】

Ubuntu 24.04采用systemd作为默认的init系统&#xff0c;我们可以通过创建systemd服务单元文件来实现开机自启动。以下是具体实施步骤&#xff1a;创建服务文件使用文本编辑器创建服务配置文件&#xff1a;sudo nano /etc/systemd/system/frps.service编写服务配置内容在文件中…

数据结构与算法-字符串、数组和广义表(String Array List)

3 字符串、数组和广义表&#xff08;String Array List&#xff09; 3.1 字符串&#xff08;String&#xff09; 3.1.1 串的顺序存储 a. 定长顺序&#xff1a; #define MAXLEN 255 // 串的定长顺序存储结构 typedef struct {char ch[MAXLEN 1]; // 字符串数据&#xff0c;…

【网络运维】Shell 脚本编程:if 条件语句

Shell 脚本编程&#xff1a;if 条件语句 if 条件语句概述 if 条件语句是 Linux Shell 脚本编程中最基础且使用频率最高的控制结构之一&#xff0c;其语义类似于自然语言中的“如果…那么…”。熟练掌握 if 语句的用法&#xff0c;是成为一名合格运维工程师的基本要求。 if 语句…

浮点型的位结构和表示的值

位结构float 各部分的含义 符号位&#xff1a; 为 0 表示正数&#xff0c;为 1 表示负数。 指数部分&#xff1a; 指数部分是一个移码。指数部分有 8 位&#xff0c;首先当成无符号整型&#xff0c;则值域是 [0, 255] .因为是移码&#xff0c;所以 移码值 无符号整型值 - 127 …

39_基于深度学习的行人摔倒检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)

目录 项目介绍&#x1f3af; 功能展示&#x1f31f; 一、环境安装&#x1f386; 环境配置说明&#x1f4d8; 安装指南说明&#x1f3a5; 环境安装教学视频 &#x1f31f; 二、数据集介绍&#x1f31f; 三、系统环境&#xff08;框架/依赖库&#xff09;说明&#x1f9f1; 系统环…

【系统分析师】高分论文:论企业数据治理

【摘要】 2022年3月&#xff0c;我作为系统分析师及IT 负责人&#xff0c;参加了我司的企业级数据平台建设项目&#xff0c;该项目作为我司在企业数字化转型过程中重要的里程碑&#xff0c;在我司数字化运营中扮演着关键的角色。该项目主要包含企业级数据仓库&#xff0c;数据治…

Seata原理分析

简介Apache Seata™ (incubating) 是什么&#xff1f;Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前&#xff0c;其内部版本在阿里系内部一直扮演着应用架构层数据一致性的中间件角色&#x…

力扣 30 天 JavaScript 挑战 第38天 (第九题)学习了 语句表达式的区别 高级函数 promise async await 节流

开始答题 版本一&#xff1a; /*** param {Function} fn* return {Function}*/ var once function(fn) {let runCount0return function(...args){runCountrunCount 1 ? return fn(...args) :return undefined} };/*** let fn (a,b,c) > (a b c)* let onceFn once(fn)…

25年八月份宁德时代社招部分岗位入职Verify测评演绎数字推理SHL题型变更、题库使用说明

开始测评前&#xff0c;请注意:1、挑选一个安静的环境&#xff0c;选择一台网速正常且无任何网络端口限制的电脑进行测评;2、移动设备无法兼容远程监考功能&#xff0c;请使用配备有可正常运作的摄像头的台式机或笔记本电脑&#xff0c;建议使用最新版本的Chrome&#xff0c;Fi…

【KO】前端面试四

以下是剩余题目的详细解答,结合前端知识体系和实际应用场景展开: 91. JS 放在 head 里和放在 body 里有什么区别? 对比维度 放在 <head> 放在 <body> 加载阻塞性 会阻塞页面渲染,需等待 JS 下载/执行完成后,才继续渲染页面 一般放在 </body> 前,页面渲…

[Vid-LLM] 数据集 | 基准测试

第5章&#xff1a;数据集与基准测试 在前一章中&#xff0c;我们探讨了**视频大语言模型(Vid-LLMs)**能够执行的各种"工作"或"功能"&#xff0c;从视频总结到充当智能代理。 我们了解了它们的构建方式和扮演的角色。 但这里有个关键问题&#xff1a;这些惊…

34、扩展仓储管理系统 (跨境汽车零部件模拟) - /物流与仓储组件/extended-warehouse-management

76个工业组件库示例汇总 扩展仓储管理系统 (跨境汽车零部件模拟) 概述 这是一个高级的仓储管理系统 (WMS) 模拟组件&#xff0c;专为展示跨境汽车零部件的复杂物流场景而设计。它模拟了从海外供应商发货&#xff0c;经过海运/空运、清关、质检&#xff0c;到最终入库上架&am…

nodejs koa留言板案例开发

包含功能 登录注册(不开放注册只是用固定的账号信息) 查看列表 查看详情 发布信息 编辑信息 删除信息 项目接口 npm init -y npm install koa --save npm istall koa-router --save (旧版本) 或者 npm install koa/router --save &#xff08;新版本&#xff09; npm instal…