是否有任何方法可以通过
OnInitializedAsync
生命周期方法检测 Blazor 组件中是否正在进行预渲染?我知道组件工作流程会调用 OnInitializedAsync
两次,第一次用于预渲染,第二次用于实际渲染。最后一次性调用 OnAfterRenderAsync
方法进行实际渲染。
但是,我需要检测
OnInitializedAsync
中的预渲染。这样我就可以在预渲染中进行一些更改并在实际渲染中阻止它,反之亦然。
我检查了下面的 GitHub 问题,但没有有效的解决方案。我希望,它应该在像
IsPrerendering
这样的 API 中得到解决。
https://github.com/dotnet/aspnetcore/issues/17282
提前致谢。
没有内置API,但您可以使用HTTP上下文来检测它。
我已将其包装在 nuget 包中
https://www.nuget.org/packages/PreRenderComponent
更新:
从这次开始,情况发生了变化,虽然仍然没有 api 来检测这一点,但您应该只在调用 OnAfterRender/OnAfterRenderAsync 后执行外部调用(例如 JSInterop 和 HTTP 调用)。
如果您坚持这种模式,则无需了解预渲染状态。
您可以使用 IHttpContextAccessor.HttpContext.Response.HasStarted 属性来检查应用程序是否正在预渲染。 HasStarted 指定响应标头已发送到客户端。如果 HasStarted 设置为 false,则表示应用程序仍在预渲染,尚未建立客户端连接。
如果是服务器渲染,您可以检查javascript是否可用。
public static bool IsPreRendering(this IJSRuntime runtime)
{
// The peculiar thing in prerender is that Blazor circuit isn't yet created, so we can't use JSInterop
return !(bool)runtime.GetType().GetProperty("IsInitialized").GetValue(runtime);
}
接受的响应(使用 HttpContextAccessor)是一个糟糕的建议。无法保证预渲染和渲染后的 HttpContext 是什么。因此,您不能依赖它。有时会起作用,有时则不起作用。
要检测 Blazor 服务器上的预渲染,我建议按照官方文档进行操作,这里是引用:
预渲染其内容的 Blazor 服务器应用程序调用 OnInitializedAsync 两次:
当组件最初作为页面的一部分静态呈现时。
当浏览器第二次建立与服务器的连接时。
要防止 OnInitializedAsync 中的开发人员代码运行两次,请参阅预渲染后有状态重新连接部分。
我正在向 SomeClient 类添加静态布尔字段“ClientClass.PrerenderMode = false”
有
客户端未设置布尔值。
在服务器“_Host.cshtml”上
@{ ClientClass.PrerenderMode = true; }
PS:如果您有带有 Blazor Web assembly 的网络核心服务器