在每个页面导航上执行blazor标头OnInitialized



我有一个Blazor服务器端应用程序。它有一个适用于所有页面的通用标题。在标头的OnInitialized中,它检查用户是否有任何新消息。如果是,它将闪烁一个图标。这个代码当然会在站点加载时执行一次。但是,对于以后每次导航到不同页面,它都不会再次执行。

有没有一种方法可以在每次用户导航到任何页面时重新执行?我知道我也可以在后台使用计时器来完成这项工作,但不知道仅仅通过页面导航是否可行?

谢谢!

您有两个选项,它们应该在服务器端和客户端都可以工作。

  1. 根据Blazor文档,您可以订阅LocationChanged事件。您可以在任何可以获得NavigationManager参考的地方执行此操作

以下组件通过订阅NavigationManager.LocationChanged.来处理位置更改事件

  1. 您可以在MainLayout.razor页面上覆盖OnAfterRenderAsyncBlazor方法由于这是一个共享布局组件,因此每次应用程序导航时都会对其进行渲染您甚至可以@inject NavigationManager _navigationManager来检查渲染的页面

选项2的代码示例:

@inject NavigationManager _navigationManager
@code {
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        var url = _navigationManager.Uri;
        //write you code here...
    }
}

选项2可能是最好的使用方式,因为您的代码将在渲染的UI上运行,因此您可以更改元素

如果是服务器端,为什么不使用所有InvokeAsync(StateHasChanged(以防出现新消息。

所以在你的*.剃刀代码部分:

protected override async Task OnInitializedAsync()
{
    MyBackendService.OnUpdate += OnUpdate;
}
private void OnUpdate()
{
    // May be additional code to load the message - if requred
    InvokeAsync(StateHasChanged);        
}

在新消息到达或创建的后端服务中:

public event Action OnUpdate;
internal void UpdateView() => OnUpdate?.Invoke();

现在您可以调用UpdateView((,以防出现新消息,比如回调视图以重新加载。

相关内容

  • 没有找到相关文章