【问题标题】:Fetching Data in Blazor ComponentBase class在 Blazor ComponentBase 类中获取数据
【发布时间】:2020-10-18 12:33:59
【问题描述】:

每个 Blazor 组件都有一个可以被覆盖的方法 OnInitializedAsync()。 这似乎是任何调用获取组件渲染期间应使用的数据的好地方,例如:

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

但是,在 Blazor 组件中存在一个已知行为,其中 OnInitializedAsync() 方法被触发两次。在Stackoverflow discussion中有关于如何处理的说明。

建议检查 ComponentContext.IsConnected 状态,该状态只允许触发一次所需的操作。

但是,update from September, 4th 告诉我们应该

删除IComponentContext 的任何用法,并将预渲染期间不应运行的任何逻辑移至OnAfterRenderOnAfterRenderAsync

这里也不能使用OnAfterRenderAsync。是的,它只被触发一次,但是在它被触发时,组件已经被渲染,并且检索任何应该用于渲染的数据已经很晚了。

所以问题是:

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

【问题讨论】:

    标签: blazor


    【解决方案1】:

    如果您使用 Blazor Server 应用程序,则会执行两次 OnInitialized(Async) 对,并启用预渲染。要禁用预渲染,您应该将 _Host.cshtml 文件中组件元素的属性 render-mode 设置为“Server”

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

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

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

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

    OnAfterRender(Async) 对不适合该目的,尽管它在小规模数据负载上似乎可以很好地呈现。它们最适合用于在 Blazor 组件被渲染后初始化 JavaScript 组件。

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2019-10-02
      • 1970-01-01
      • 2021-11-09
      • 2021-03-21
      • 1970-01-01
      • 2021-10-09
      • 2021-11-10
      相关资源
      最近更新 更多