如何在 Blazor Web 程序集中更新 NavMenu

How to update NavMenu in Blazor web assembly

我需要在 Web Assembly 中动态更新侧边导航栏。

你能建议我怎么做吗?

@page "/ChildPage"

    @code{
        public List<string> menus = new List<string>();
        NavMenu n = new NavMenu();
        protected override async Task OnInitializedAsync()
        {
            menus.Add("Content 1");
            menus.Add("Content 2");

            await Task.Run(() => n.MenuItems = menus);
        }
    }

在 Navmenu razor 中做了如下操作。

<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
    <ul class="nav flex-column">
        @if (MenuItems != null)
        {
            @foreach (var menu in MenuItems)
            {
                <li class="nav-item px-3">
                    <NavLink class="nav-link" href="Page1">
                        <span class="oi oi-plus" aria-hidden="true"></span> @menu
                    </NavLink>
                </li>
            }
        }

    </ul>
</div>



@code {
    private bool collapseNavMenu = true;

    private string NavMenuCssClass => collapseNavMenu ? "collapse" : null;

    private void ToggleNavMenu()
    {
        collapseNavMenu = !collapseNavMenu;
    }

    public List<string> MenuItems = new List<string>() { "Page 1", "Page 2"};
}

你能建议我如何从每个页面更新导航栏吗?

您可以像这样创建服务

public interface IMenuService
{
  List<MenuItem> AdditionalMenuItems { get; set; }
  event EventHandler<EventArgs> OnChanged;
  void NotifyChanged();
}

将其注册为作用域

services.AddScoped<IMenuService, MenuService>();

您可以将其注入您的页面并添加

@inject IMenuService MenuService

protected override void OnInitialized()
{
  MenuService.Add(whatever);
  MenuService.NotifyChanged();
}

在您的布局中

@implements IDisposable
@inject IMenuService MenuService

@foreach(MenuItem menuItem in MenuService.AdditionalMenuItems)
{
  // Whatever
}

// code section
protected override void OnInitialized()
{
  MenuService.OnChanged += MenuChanged;
}

void IDisposable.Dispose()
{
  MenuService.OnChanged -= MenuChanged;
}

private void MenuChanged(EventArgs e)
{
  InvokeAsync(StateHasChanged);
}