据我了解,如果启用预渲染,Blazor SSR 组件的 OnInitialized 方法会执行两次。我已经在 OnInitialized 方法中编写了业务逻辑,例如从数据库加载所有产品。如何防止业务逻辑执行两次?我是否必须使用局部变量(例如 IsInitialized = false)来跟踪它,然后在业务逻辑执行后将其设置为 true? Blazor 是否有内置方法来检测此问题?或者我应该将业务逻辑转移到不同的生命周期方法?
我们可以通过多种方式实现:
1.正如官方文档所说:
防止 OnInitializedAsync 中的开发人员代码运行两次 预渲染时,请参阅预渲染后有状态重新连接部分。
2.您可以使用
IHttpContextAccessor.HttpContext.Response.HasStarted
属性来检查应用程序是否预渲染。
@code{
[Inject]
protected IHttpContextAccessor httpContextAccessor { get; set; }
protected override async Task OnInitializedAsync()
{
var isPreRendering = !this.httpContextAccessor.HttpContext.Response.HasStarted;
if (!isPreRendering)
{
//call your service...
}
}
}
HttpContextAccessor
服务应通过调用AddHttpContextAccessor
中的Program.cs
方法来注册。
builder.Services.AddHttpContextAccessor();
3.如果您需要执行仅在组件完全渲染后运行一次的逻辑,请考虑使用
OnAfterRenderAsync
。但是,请小心,因为它会在每次渲染后运行。
@code{
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
//call your service here
}
}
}
4.正如您所说,您可以使用标志(如 IsInitialized)来跟踪业务逻辑是否已经执行。
@code {
private bool isInitialized = false;
protected override async Task OnInitializedAsync()
{
if (!isInitialized)
{
//call your Business logic
isInitialized = true;
}
}
}