el-menu动态渲染问题

文章讲述了在ElementUI中,动态渲染菜单列表时遇到的激活样式bug和前后el-submenu状态互相影响的问题。解决方法包括使用`key`属性区分el-menu-item和el-submenu,并指出在Vue2环境下使用ElementUIPlus+Vue3可能存在的未知情况。

element ui
对于菜单列表,可以使用el-menu 组件进行渲染,但是当渲染的列表会动态的变化时,会出现一定问题

后渲染的列表激活样式bug

问题:初始渲染的菜单列表点击可以选中,并显示激活状态。但是当列表动态切换后,再次渲染的列表在点击时没有激活样式,最多只显示悬浮样式,想要有激活样式,需要双击。
解决:需要对el-menu-item标签进行区分,可以使用:key="id"等属性对各个el-menu-item标签进行区分,使其重新渲染。

前后渲染的el-submenu互相影响

问题:初始的el-submenu展开时,若切换渲染列表,则渲染后的el-submenu也保持展开时状态。即前后渲染的el-submenu展开与收起会保持一致
解决:此时对el-submenu使用key进行区分并不比作用,需要使用:index="id"对el-submenu进行区分。index是el-submenu的唯一区分标志。

以上测试使用的是Element UI,Vue2环境。Element UI Plus+Vue3是否有同样问题或解决是否同样生效未知

### 实现 `el-menu` 动态生成二级菜单 以下是通过 Vue 和 Element-UI 的方式实现动态加载二级菜单的示例代码。此方法利用了数据驱动视图的思想,将菜单项的数据存储在一个数组中,并绑定到模板中的 `el-submenu` 和 `el-menu-item`。 #### 示例代码 ```html <template> <div> <!-- 菜单 --> <el-menu :default-active="activeIndex" router mode="vertical" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b"> <!-- 遍历一级菜单 --> <el-submenu v-for="(item, index) in menuData" :key="index" :index="item.catalogCode"> <template slot="title"> <i class="el-icon-location"></i> <span>{{ item.catalogName }}</span> </template> <!-- 如果存在子菜单,则遍历并渲染 --> <el-menu-item v-for="(subItem, subIndex) in item.childCatalogs" :key="`${index}-${subIndex}`" :index="subItem.catalogCode"> {{ subItem.catalogName }} </el-menu-item> </el-submenu> </el-menu> </div> </template> <script> export default { data() { return { // 当前激活的菜单索引 activeIndex: '/home', // 菜单项数据 menuData: [ { catalogCode: '001', catalogName: '分类一', childCatalogs: [ { catalogCode: '002', catalogName: '子分类A' }, { catalogCode: '003', catalogName: '子分类B' } ] }, { catalogCode: '004', catalogName: '分类二', childCatalogs: [ { catalogCode: '005', catalogName: '子分类C' }, { catalogCode: '006', catalogName: '子分类D' } ] } ] }; } }; </script> <style scoped> /* 自定义样式 */ .el-menu { border-right: none; } </style> ``` --- #### 关键点解析 1. **数据结构设计** 数据采用树形结构表示菜单及其子菜单的关系[^4]。父级菜单由 `catalogCode` 和 `catalogName` 定义,而子菜单则存放在 `childCatalogs` 数组中。 2. **动态渲染** 利用 Vue 的 `v-for` 指令分别对一级菜单和二级菜单进行循环渲染。对于有子菜单的一级菜单,使用 `<el-submenu>` 组件;而对于具体的菜单选项,则使用 `<el-menu-item>` 组件。 3. **路由支持** 设置 `router=true` 属性后,可以通过 `index` 值匹配对应的路由地址[^3]。如果需要更复杂的跳转逻辑,可以监听 `@select` 事件处理自定义行为。 4. **默认选中状态** 使用 `:default-active="$route.path"` 可以让当前页面的路径自动高亮对应菜单项[^3]。 5. **样式定制** 对于 `.el-menu` 默认样式的调整,可通过 CSS 进行覆盖[^1]。 --- ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨灰ash2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值