如何强制MainLayout中的PrimaryNav组件在页面切换时重新渲染?
你可以通过以下几种方法实现页面切换时强制PrimaryNav重新渲染,不用维护两个布局:
方法一:在MainLayout中监听路由变化,传递更新参数
在MainLayout里注入NavigationManager,监听路由地址变化,更新一个参数传递给PrimaryNav,利用Blazor的参数变化触发重新渲染机制:
@inject NavigationManager NavManager @implements IDisposable <ErrorBoundary> <ChildContent> <main class="@pageClass"> <PopupMessageBox> <header class="main-header"> <PrimaryNav UserAvatarUrl="@UserAvatarUrl" IsManagerOrSysAdmin="@(Principal.IsManagerOrSysAdmin())" CurrentRoute="@_currentRoute" /> </header> <div class="main-content"> @Body </div> </PopupMessageBox> </main> </ChildContent> </ErrorBoundary> @code { private string _currentRoute; protected override void OnInitialized() { _currentRoute = NavManager.Uri; NavManager.LocationChanged += HandleLocationChanged; } private void HandleLocationChanged(object? sender, LocationChangedEventArgs e) { _currentRoute = e.Location; StateHasChanged(); } public void Dispose() { NavManager.LocationChanged -= HandleLocationChanged; } }
PrimaryNav只需要新增一个CurrentRoute参数即可——哪怕你在组件里不用这个参数,只要它的数值变化,Blazor就会自动重新渲染PrimaryNav,让它能识别当前页面并更新菜单。
方法二:在PrimaryNav内部监听路由变化
直接在PrimaryNav组件里注入NavigationManager,监听路由变化后主动触发重新渲染,这种方式不需要修改MainLayout,更独立:
@inject NavigationManager NavManager @implements IDisposable <!-- PrimaryNav的菜单内容 --> @code { [Parameter] public string UserAvatarUrl { get; set; } [Parameter] public bool IsManagerOrSysAdmin { get; set; } protected override void OnInitialized() { NavManager.LocationChanged += HandleLocationChanged; } private void HandleLocationChanged(object? sender, LocationChangedEventArgs e) { StateHasChanged(); } public void Dispose() { NavManager.LocationChanged -= HandleLocationChanged; } }
这两种方法都能让PrimaryNav在页面切换时重新渲染,从而根据当前页面展示对应的菜单选项,避免维护重复布局的麻烦。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

