我正在将我的应用程序从 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()
那么它会:
这一切都很棒。但是
OnInitializedAsync()
被调用两次存在问题。被调用两次只是SSR + Streaming吗?因此,这不是问题吗?
而且... 我回去看了我的一个老问题。 在 Ver 8 的早期候选版本之一中,对于
InteractiveServer
模式,它是否调用了 OnInitializedAsync()
两次?
全部正确,除了:
您又开始将其视为生命周期方法的一部分,而不是 UI 事件。
这是一个严重的过度简化,但请考虑 Blazor 同步上下文 有两个队列。
同步上下文优先考虑后队列而不是 UI 事件队列,这决定了
OnAfterRenderAsync
何时运行。
当渲染器对 UI 事件进行排队时,如果后队列已清除[排队的所有工作已完成],则它会立即运行。但是,如果发布队列很忙并且
Task.Delay
的延续已经发布[或在队列繁忙时发布],则 OnAfterRenderAsync
不会运行,直到发布队列清除,即最后一个。
另请注意,如果
OnInitializedAsync
产生,组件将渲染两次,因此 OnAfterRenderAsync
将运行两次。