el-submenu实现单个菜单折叠

本文介绍如何调整Element UI的菜单设置,通过修改unique-opened属性来防止菜单折叠框撑破页面,确保导航菜单在展开多个子菜单时保持良好的布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
以上的效果就是,我打开“系统管理”折叠框,然后再打开“采集服务器”折叠框,这样一来的话就会让这个navMenu显得很高,严重的情况,就会撑破整个页面。怎么办呢?
element代码实现如下:

<template>
    <div class="index-menu">
        <div class="index-nav">
            <el-menu :default-active="defaultActive" :unique-opened="true" background-color="rgba(35,35,35,2)"
                text-color="#FFF" active-text-color="#ccc" style="" router>
                <el-menu-item index="999" :route="{ path: '/home' }" style="text-align:left !important">
                    <i class="el-icon-location"></i>
                    <span class="el-menu-item-name" style="margin-left: 0">主页</span>
                </el-menu-item>

                <el-submenu v-for="(item,index) in menuList" :index="item.routerPath" :key="index">
                    <template slot="title">
                        <i :class="item.icon"></i>
                        <span class="el-submenu-name">{{item.name}}</span>
                    </template>
                    <el-menu-item v-for="(menu,index) in item.children" :index="menu.routerPath" :key="index">
                        <span class="el-menu-item-name">{{menu.name}}</span>
                    </el-menu-item>
                </el-submenu>
                <!-- 路由是根据后端返回做判断  张帆-->

                <el-submenu index="999">
                    <template slot="title">
                        <i class="iconfont icon-yingyong"></i>
                        <span class="el-submenu-name">音视频后台管理</span>
                    </template>
                    <el-menu-item index="9996" :route="{ path: '/balancing' }">
                        <span class="el-menu-item-name">负载均衡</span>
                    </el-menu-item>
                    <el-menu-item route="/mediaService" index="9998">
                        <span class="el-menu-item-name">流媒体服务</span>
                    </el-menu-item>

                    <el-menu-item route="/trans" index="9999">
                        <span class="el-menu-item-name">转码服务</span>
                    </el-menu-item>
                </el-submenu>

            </el-menu>
        </div>
        <div class="nav-image">
            <img src="../assets/images/map.png" alt />
        </div>
    </div>
</template>

在ele-menu里,讲:unique-opend="false"改成:unique-opend="true"即可
在这里插入图片描述
效果就这样简单的实现啦

<think>好的,我需要分析用户提供的这段Vue.js组件代码,解释它的功能和结构。首先,我会先通读代码,理解各个部分的作用。 这段代码看起来是一个Vue的模板部分,可能是一个侧边栏菜单组件。最外层有一个`<div>`,使用了`v-if`条件渲染。条件包括检查`routerItem.meta`是否存在,`meta.isSideBar`是否为真,以及`hasAdminRole(routerItem)`是否返回真值。这说明这个侧边栏项是否显示取决于路由的元数据和用户权限。 接下来,`:class`绑定了多个类名,根据`isCollapse`决定是简单模式还是完整模式,还有`isFirstLevel`判断是否是第一级菜单。这可能是用来控制菜单的展开或折叠样式。 然后,内部有一个`<template>`使用`v-if`判断`routerItem`是否有子路由。如果没有子路由,就渲染一个链接组件`SidebarItemLink`,里面包含一个`el-menu-item`(Element UI的菜单项)。这里用到了`resolvePath`来处理路径,可能用于生成正确的路由链接。同时显示图标和标题,图标和标题都来自`routerItem.meta`。 如果存在子路由,则使用`el-submenu`(Element UI的子菜单)。标题部分同样显示图标和标题。然后循环遍历子路由,递归渲染`SidebarItem`组件,传递相关属性。这里注意到`is-first-level`被设为false,可能用来控制子菜单的层级样式。 需要注意的是,代码中有注释掉的部分,可能是之前的尝试或未完成的功能,但当前不影响逻辑。 总结下来,这个组件负责根据路由配置动态生成侧边栏菜单,处理权限控制、展开折叠状态,以及多级子菜单的递归渲染。可能存在优化的地方,比如注释掉的代码和图标类名的处理,但整体结构清晰,符合Vue和Element UI的使用方式。</think>这是一个基于Vue.js框架的侧边栏菜单组件,主要实现动态路由菜单渲染。以下是逐层解析: 1. **外层条件渲染**(第2行) - `v-if="routerItem.meta && routerItem.meta.isSideBar && hasAdminRole(routerItem)"` - 三元条件控制显示: * 检查路由元数据存在性 * 检查`isSideBar`侧边栏展示标记 * `hasAdminRole`进行权限校验 2. **布局模式控制**(第3行) ```html :class="['menu-wrapper', isCollapse ? 'simple-mode' : 'full-mode', { 'first-level': isFirstLevel }]" ``` - 响应式布局切换: * `isCollapse`控制折叠状态,对应`simple-mode`(精简模式)和`full-mode`(完整模式) * `first-level`类名标记一级菜单 3. **叶子节点处理**(第5-13行) ```html <template v-if="!routerItem.children || routerItem.children.length === 0"> <SidebarItemLink> <!-- 无子菜单时渲染单个菜单--> <el-menu-item> <!-- Element UI菜单项组件 --> <i v-if="routerItem.children"...> <!-- 图标渲染 --> <span...>{{ routerItem.meta.title }}</span> <!-- 标题显示 --> </el-menu-item> </SidebarItemLink> </template> ``` 4. **嵌套菜单处理**(第14-30行) ```html <el-submenu v-else> <!-- Element UI子菜单组件 --> <template slot="title"> <!--菜单标题 --> <i...></i> <!-- 图标 --> <span...></span> <!-- 标题 --> </template> <template v-for="child in routerItem.children"> <!-- 递归渲染 --> <SidebarItem :routerItem="child".../> <!-- 递归组件 --> </template> </el-submenu> ``` - 递归逻辑说明: * 通过`<SidebarItem>`组件自身递归调用 * `is-first-level`参数传递变为false * `base-path`通过`resolvePath`方法生成嵌套路径 5. **关键技术点**: - **动态路径解析**:`resolvePath`方法处理路由嵌套 - **权限控制**:`hasAdminRole`实现路由级权限过滤 - **状态响应**:`isCollapse`控制菜单折叠/展开的响应式样式 - **Element UI集成**:使用`el-menu-item`和`el-submenu`组件构建菜单系统 存在优化建议: 1. 图标渲染条件`v-if="routerItem.children"`在叶子节点模板中永远为false 2. 注释掉的`<!-- <el-submenu :index="resolvePath(item.path)"...>`可能是未清理的冗余代码 3. `xxIcon`类名建议使用具体图标库前缀(如el-icon)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值