【问题标题】:How to prevent the flashing of content in a prerendered Blazor WebAssembly app?如何防止预呈现的 Blazor WebAssembly 应用程序中的内容闪烁?
【发布时间】:2020-12-29 22:56:34
【问题描述】:

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

App.Client/Pages/Test.razor

@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。 OnInitializedAsync 在客户端再次调用,text 被设置回 foo,但仅在一秒钟后屏幕上没有任何内容 - 服务器端渲染旨在避免这种情况首先。

您知道发送已填充数据的组件的任何方法吗?

【问题讨论】:

    标签: asp.net-core blazor-webassembly


    【解决方案1】:

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

    是的,他们使用的预渲染不是很好,但假设您将 Blazor 用于 SPA,它应该只发生一次。如果您使用 Microsoft.AspNetCore.Components.NavigationManager NavigateTo 方法,请小心避免硬重新加载。硬重新加载会触发预渲染,因为您刷新了 SPA。

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

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

    【讨论】:

    • 你的意思是单例服务吗?如果是这样,我不能在 EF 中使用这种方法,因为 DbContext 是一个作用域服务,因此不能由单例使用。相反,我选择像这样缓存服务结果link
    • 是的......对不起......服务。习惯于在控制器中思考!对于它的价值,我认为 EF 比它的价值更麻烦。我使用 Dapper。我也在一些领域使用了 MemoryCache ......但通常在服务内部而不是直接在页面或控件中。
    猜你喜欢
    • 2021-05-04
    • 2022-01-15
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2016-11-19
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多