是否有任何方法可以从OnInitializedAsync
生命周期方法检测Blazor组件中正在进行的预渲染?我知道组件工作流会调用OnInitializedAsync
两次,第一次用于预渲染,第二次用于实际渲染。最后,调用OnAfterRenderAsync
方法在一次内进行实际渲染。
但是,我需要检测OnInitializedAsync
中的预渲染。这样我就可以在预渲染中进行一些更改,并在实际渲染中阻止它,反之亦然。
我检查了下面的GitHub问题,但它没有有效的解决方案。我希望它应该在像IsPrerendering
这样的API中解决。
https://github.com/dotnet/aspnetcore/issues/17282
提前谢谢。
没有内置API,但您可以使用HTTP上下文来检测它
我已经把这个包裹在一个新的包裹里了
https://www.nuget.org/packages/PreRenderComponent
更新:
从那时起,情况发生了变化,虽然仍然没有用于检测这一点的api,但在调用OnAfterRender/OnAfterRender sync后,您应该只执行外部调用(如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是什么。因此,你不能依赖它。有时它会起作用,有时不会。
如果有很多流量,HttpContext可能会引用其他一些不相关的请求。
要检测Blazor服务器上的预渲染,我建议根据官方文档采取行动,这里引用:
Blazor服务器应用程序预呈现其内容时会调用OnInitializedAsync两次:
当组件最初作为页面的一部分静态呈现时一次。
当浏览器再次建立与服务器的连接时。
要防止OnInitializedAsync中的开发人员代码运行两次,请参阅预提交后的Stateful重新连接部分。
我正在添加静态布尔字段">ClientClass.PrerenderMode=false";到SomeClient类
A有
- 主机(取决于:客户端(
- 共享
- 客户
客户端未设置bool。
在服务器上">_主机.cshtml";@{ ClientClass.PrerenderMode = true; }
PS:如果你有Blazor Webassembly 的网络核心服务器