Blazor InteractiveServer 和预渲染 - 何时调用 OnInitializedAsync()?

问题描述 投票:0回答:1

我正在将我的应用程序从 Blazor Ver 6/7 服务器端升级到 Ver 8 InteractiveServer。我想要预渲染,这将首先渲染页面脚手架/骨架,然后我们花时间从数据库中读取数据以填充页面。

总而言之,让整个应用程序、所有组件(除非明确指定不同)成为启用预渲染的 InteractiveServer 的方法是:

程序.cs:

builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();
// other stuff
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

在 App.razor 中:

    <HeadOutlet @rendermode="InteractiveServer" />
</head>
<body>
    <Routes @rendermode="InteractiveServer" />
    <script src="_framework/blazor.web.js"></script>
</body>

这是我的问题。在我的测试中,

OnInitializedAsync()
仅被调用一次。渲染脚手架/骨架后。如果我在
Task.Delay()
中放入
OnInitializedAsync()
那么它会:

  1. 输入OnInitializedAsync
  2. 任务.Delay()
  3. 页面骨架显示
  4. OnAfterRenderAsync
  5. OnInitializedAsync 完成

这一切都很棒。但是

OnInitializedAsync()
被调用两次存在问题。被调用两次只是SSR + Streaming吗?因此,这不是问题吗?

而且... 我回去看了我的一个老问题。 在 Ver 8 的早期候选版本之一中,对于

InteractiveServer
模式,它是否调用了
OnInitializedAsync()
两次?

blazor blazor-server-side
1个回答
0
投票

全部正确,除了:

  1. OnAfterRenderAsync

您又开始将其视为生命周期方法的一部分,而不是 UI 事件。

这是一个严重的过度简化,但请考虑 Blazor 同步上下文 有两个队列。

  1. 发送/发布队列,其中发布所有 Rendering [RenderFramgents] 和 Continuations
  2. 发布 UI 事件的事件队列。

同步上下文优先考虑后队列而不是 UI 事件队列,这决定了

OnAfterRenderAsync
何时运行。

当渲染器对 UI 事件进行排队时,如果后队列已清除[排队的所有工作已完成],则它会立即运行。但是,如果发布队列很忙并且

Task.Delay
的延续已经发布[或在队列繁忙时发布],则
OnAfterRenderAsync
不会运行,直到发布队列清除,即最后一个。

另请注意,如果

OnInitializedAsync
产生,组件将渲染两次,因此
OnAfterRenderAsync
将运行两次。

© www.soinside.com 2019 - 2024. All rights reserved.