在 Blazor 组件基类中提取数据



每个 Blazor 组件都有一个可以重写的方法OnInitializedAsync()。 对于任何调用以获取应在组件渲染期间使用的数据来说,这似乎是一个很好的地方,例如:

protected override async Task OnInitializedAsync()
{
var dataForRendering = await SomeHttpClient.RetrieveSomeData();
}

但是,Blazor 组件中存在一种已知行为,其中OnInitializedAsync()方法触发两次。在 Stackoverflow 讨论中有一个关于如何处理它的描述。

那里的建议是检查仅允许触发一次所需操作的ComponentContext.IsConnected状态。

但是,9月4日的更新告诉我们,我们应该

删除任何IComponentContext用法,并将预呈现期间不应运行的任何逻辑移动到OnAfterRenderOnAfterRenderAsync中。

在这里使用OnAfterRenderAsync也不是一种选择。是的,它只被触发一次,但是当它被触发时,组件已经渲染,检索任何应该用于渲染的数据都太晚了。

所以问题是:

  1. 现在如何避免在"OnInitializedAsync(("执行期间重复加载数据?对数据服务器的两次调用不是一个很好的性能示例。
  2. 像这样为组件渲染加载数据是个好主意吗?也许有更好的方法将数据传递给组件?

如果使用 Blazor 服务器应用,则会执行两次 OnInitialized(异步( 对,并且启用了预呈现。要禁用预呈现,您应该将 _Host.cshtml 文件中组件元素的属性呈现模式设置为"服务器">

<app>
<component type="typeof(App)" render-mode="Server" />
</app>

这将禁用预渲染功能。无需预渲染,无需第二次执行代码。

像这样为组件渲染加载数据是个好主意吗?也许有更好的方法将数据传递给组件?

使用数据初始化组件的方法是使用 OnInitialized(Async( 对...

OnAfterRender(Async(对不适合该目的,尽管它在小规模数据加载中似乎呈现良好。它们最适合用于在呈现 Blazor 组件后启动 JavaScript 组合。

希望这有帮助...

最新更新