如何防止预渲染的Blazor WebAssembly应用程序中的内容闪烁



以下代码片段可以说明在服务器端呈现的Blazor应用程序中存在的问题:

应用程序。客户端/页面/测试剃刀

@page "/test" 
<p>@text</p>
@code 
{
private string text;
protected override async Task OnInitializedAsync()
{
await Task.Delay(1000); // wait 1000 milliseconds
text = "foo";
}
}

当组件首次在服务器上初始化时,text变量设置为foo,并将包含该字符串的HTML文档发送到客户端。然而,客户端Blazor应用程序不知道服务器分配给变量的值,该值再次变为null。客户端上再次调用OnInitializedAsynctext被设置回foo,但仅在一秒钟后,屏幕上什么都没有——服务器端渲染首先要避免这种情况。

你知道有什么方法可以发送已经填充了数据的组件吗?

好吧——只是有点挑剔——这是一个Blazor页面。。。。它不是一个组件。

是的,他们使用的预渲染并不好,但假设你使用Blazor进行SPA,这种情况应该只发生一次。如果您使用Microsoft,请小心避免硬重新加载。AspNetCore。组件。NavigationManager NavigateTo方法。硬重新加载会触发预渲染,因为您刷新了SPA。

为了避免鞭笞,您希望避免需要1秒来加载文本值。因此,您可以使用singleton控制器并将其注入到页面中。在预渲染过程中,值还不知道,所以我们需要1秒来加载它。然后在客户端过程中,可以立即通过控制器访问数据。

当然,如果要显示大量数据,这并不完美。但在这种情况下,我通常会展示一个"加载"旋转器,它会给客户一种受控运动的感觉。

最新更新