浏览器意外刷新时的 Blazor WebAssembly 生命周期方法
Blazor WebAssembly Lifecycle Methods when accidentally Browser refreshes
我正在习惯 Blazor WASM。
我有一些页面继承自自定义基础 class。
在这个基础中 class 我有一个级联参数。
public class CustomBlazorComponentBase : LayoutComponentBase
{
private bool disposedValue;
[Inject]
protected HttpInterceptorService Interceptor { get; set; }
[CascadingParameter]
protected TelerikNotification Notification { get; set; }
protected override Task OnInitializedAsync()
{
Interceptor.RegisterEvent(Notification.ShowError);
return base.OnInitializedAsync();
}
}
在 MainLayout.razor 我得到了以下几行
<CascadingValue IsFixed="true" Value="@Notification">
<div class="content px-4">
@Body
</div>
</CascadingValue>
<TelerikNotification @ref="@Notification" Class="notification"
HorizontalPosition="@NotificationHorizontalPosition.Center"
VerticalPosition="@NotificationVerticalPosition.Bottom" />
页面开始
@inherits ItnBlazorComponentBase
HttpInterceptor-Class 获取委托以在出现问题时显示错误。
一切正常,符合预期。
但是当用户不小心按下浏览器的 F5 键来刷新页面时,不会调用生命周期方法。不是 OnInitializedAsync,不是 OnParametersSetAsync 等等。
为什么?以及如何避免这个问题?
问题是,我的代表将不会注册,因此不会显示任何通知。
谢谢!
经过几个小时的研究回答我自己的问题。它非常简单,并在 Whosebug
的这个问题中得到了回答
解决方案是用布尔值
包围 MainLayout.razor 中的 CascadingParameter
@if (HasRendered)
{
<CascadingValue IsFixed="true" Value="@Notification">
<div class="content px-4">
@Body
</div>
</CascadingValue>
}
并在代码隐藏 MainLayout.razor.cs 中设置它在第一次渲染后
protected override void OnAfterRender(bool firstRender)
{
if(firstRender)
{
HasRendered = true;
StateHasChanged();
}
base.OnAfterRender(firstRender);
}
我应用了您的解决方案,但问题仍未解决,刷新页面时级联参数丢失
@if(已渲染)
{
@Body
}
然后我定义了 bool 变量 HasRendered 并将下面的代码粘贴到 MainLayout.razor.cs
受保护的覆盖 void OnAfterRender(bool firstRender)
{
如果(第一次渲染)
{
HasRendered = true;
StateHasChanged();
}
base.OnAfterRender(firstRender);
}
我正在习惯 Blazor WASM。 我有一些页面继承自自定义基础 class。 在这个基础中 class 我有一个级联参数。
public class CustomBlazorComponentBase : LayoutComponentBase
{
private bool disposedValue;
[Inject]
protected HttpInterceptorService Interceptor { get; set; }
[CascadingParameter]
protected TelerikNotification Notification { get; set; }
protected override Task OnInitializedAsync()
{
Interceptor.RegisterEvent(Notification.ShowError);
return base.OnInitializedAsync();
}
}
在 MainLayout.razor 我得到了以下几行
<CascadingValue IsFixed="true" Value="@Notification">
<div class="content px-4">
@Body
</div>
</CascadingValue>
<TelerikNotification @ref="@Notification" Class="notification"
HorizontalPosition="@NotificationHorizontalPosition.Center"
VerticalPosition="@NotificationVerticalPosition.Bottom" />
页面开始
@inherits ItnBlazorComponentBase
HttpInterceptor-Class 获取委托以在出现问题时显示错误。 一切正常,符合预期。
但是当用户不小心按下浏览器的 F5 键来刷新页面时,不会调用生命周期方法。不是 OnInitializedAsync,不是 OnParametersSetAsync 等等。
为什么?以及如何避免这个问题? 问题是,我的代表将不会注册,因此不会显示任何通知。
谢谢!
经过几个小时的研究回答我自己的问题。它非常简单,并在 Whosebug
的这个问题中得到了回答解决方案是用布尔值
包围 MainLayout.razor 中的 CascadingParameter @if (HasRendered)
{
<CascadingValue IsFixed="true" Value="@Notification">
<div class="content px-4">
@Body
</div>
</CascadingValue>
}
并在代码隐藏 MainLayout.razor.cs 中设置它在第一次渲染后
protected override void OnAfterRender(bool firstRender)
{
if(firstRender)
{
HasRendered = true;
StateHasChanged();
}
base.OnAfterRender(firstRender);
}
我应用了您的解决方案,但问题仍未解决,刷新页面时级联参数丢失 @if(已渲染) { @Body
}
然后我定义了 bool 变量 HasRendered 并将下面的代码粘贴到 MainLayout.razor.cs 受保护的覆盖 void OnAfterRender(bool firstRender) { 如果(第一次渲染) { HasRendered = true; StateHasChanged(); }
base.OnAfterRender(firstRender);
}