我有一个Blazor服务器端应用程序。它有一个适用于所有页面的通用标题。在标头的OnInitialized中,它检查用户是否有任何新消息。如果是,它将闪烁一个图标。这个代码当然会在站点加载时执行一次。但是,对于以后每次导航到不同页面,它都不会再次执行。
有没有一种方法可以在每次用户导航到任何页面时重新执行?我知道我也可以在后台使用计时器来完成这项工作,但不知道仅仅通过页面导航是否可行?
谢谢!
您有两个选项,它们应该在服务器端和客户端都可以工作。
- 根据Blazor文档,您可以订阅
LocationChanged
事件。您可以在任何可以获得NavigationManager
参考的地方执行此操作
以下组件通过订阅NavigationManager.LocationChanged.来处理位置更改事件
- 您可以在
MainLayout.razor
页面上覆盖OnAfterRenderAsync
Blazor方法由于这是一个共享布局组件,因此每次应用程序导航时都会对其进行渲染您甚至可以@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((,以防出现新消息,比如回调视图以重新加载。