blazor - 在 Blazor ComponentBase 类中获取数据
问题描述
每个 Blazor 组件都有一个OnInitializedAsync()
可以重写的方法。它似乎是任何调用获取组件渲染期间应使用的数据的好地方,例如:
protected override async Task OnInitializedAsync()
{
var dataForRendering = await SomeHttpClient.RetrieveSomeData();
}
但是,在 Blazor 组件中有一个已知行为,其中该OnInitializedAsync()
方法被触发了两次。在Stackoverflow 讨论中有关于如何处理它的描述。
那里的建议是检查ComponentContext.IsConnected
只允许触发一次所需操作的状态。
然而,9 月 4 日的更新告诉我们应该
删除 的 任何用法
IComponentContext
并将预渲染期间不应运行的任何逻辑移至OnAfterRender
或OnAfterRenderAsync
。
使用OnAfterRenderAsync
而不是在这里也不是一个选项。是的,它只被触发一次,但是当它被触发时,组件已经被渲染,并且检索任何应该用于渲染的数据已经很晚了。
所以问题是:
- 现在如何避免在“OnInitializedAsync()”执行期间重复加载数据?对数据服务器的两次调用并不是一个好的性能示例。
- 为这样的组件渲染加载数据是个好主意吗?也许有更好的方法将数据传递给组件?
解决方案
如果您使用 Blazor Server 应用程序,则 OnInitialized(Async) 对将执行两次,并且启用了预渲染。要禁用预渲染,您应该将 _Host.cshtml 文件中组件元素的属性 render-mode 设置为“Server”
<app>
<component type="typeof(App)" render-mode="Server" />
</app>
这将禁用预渲染功能。没有预渲染,没有第二次执行代码。
为这样的组件渲染加载数据是个好主意吗?也许有更好的方法将数据传递给组件?
使用数据初始化组件的方法是使用 OnInitialized(Async) 对...
OnAfterRender(Async) 对不适合该目的,尽管它在小规模数据负载上似乎渲染得很好。在渲染 Blazor 组件之后,它们最适合用于初始化 JavaScript 组件。
希望这可以帮助...
推荐阅读
- python - 将 Flask 服务部署到 Azure
- python - 无法从 PyCharm python 控制台正确运行 Firefox (geckodriver)
- python - 使用python从其他列的均值和标准差的分布中创建一列随机数
- javascript - 如何在 JQuery 中使图像横向淡入(从左到右,反之亦然)?
- linux - 使用管道一次性完成 Tar 和 Rsync
- database - 为什么我们不总是使用最好的加密技术?
- google-app-engine - TaskQueue BulkAdd 需要较长时间才能完成
- scala - Scala 宏注释错误的解决方法
- c# - 无法更新 Sharepoint 站点的权限
- scala - 使用对象作为 AKKA 演员有什么危险?