You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MudNavMenu中实现同一时间仅展开一个MudNavGroup

MudNavMenu 单分组展开(手风琴效果)实现方案

MudNavMenu 暂无内置的同时间仅展开一个分组的配置属性,不管是静态写死还是动态生成的导航结构,都可以通过受控状态绑定的方式实现需求,无需修改组件内部逻辑。

实现逻辑

  • 为每个MudNavGroup分配全局唯一标识(比如分组ID、唯一编码、路由前缀均可)
  • 在组件内声明一个状态变量,存储当前处于展开状态的分组标识
  • 为每个MudNavGroup绑定Expanded属性与ExpandedChanged事件:展开某一分组时,将状态变量更新为当前分组的标识,其余分组会因标识不匹配自动进入折叠状态;点击已展开的分组时将状态变量置空,即可实现手动折叠效果。

代码示例

首先定义导航数据结构(适配动态生成场景):

// 导航分组模型
public class NavGroup
{
    public string Id { get; set; } = string.Empty; // 分组唯一标识
    public string Title { get; set; } = string.Empty;
    public string? Icon { get; set; }
    public List<NavLink> Links { get; set; } = [];
}

// 导航链接模型
public class NavLink
{
    public string Title { get; set; } = string.Empty;
    public string Href { get; set; } = string.Empty;
}

组件内实现逻辑:

<MudNavMenu>
    @foreach (var group in _navGroups)
    {
        <MudNavGroup
            Title="@group.Title"
            Icon="@group.Icon"
            Expanded="@(_currentExpandedGroupId == group.Id)"
            ExpandedChanged="(isExpanded) =>
            {
                _currentExpandedGroupId = isExpanded ? group.Id : null;
            }">
            @foreach (var link in group.Links)
            {
                <MudNavLink Href="@link.Href" Match="NavLinkMatch.Prefix">
                    @link.Title
                </MudNavLink>
            }
        </MudNavGroup>
    }
</MudNavMenu>

@code {
    // 存储当前展开的分组ID,赋值为对应分组ID可实现默认展开,null为默认全折叠
    private string? _currentExpandedGroupId = null;

    // 动态生成的导航数据源,可从接口、配置文件读取
    private List<NavGroup> _navGroups = [];

    protected override void OnInitialized()
    {
        // 初始化导航数据逻辑,示例省略
        // _navGroups = 从接口/配置加载的分组数据
    }
}

扩展说明

如果需要实现路由匹配自动展开对应分组,可在OnInitialized生命周期中获取当前页面地址,匹配到所属分组的ID后赋值给_currentExpandedGroupId即可,和现有逻辑完全兼容。


内容的提问来源于stack exchange,提问作者Mbongo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:48:18