在Blazor ComponentBase类中获取数据

在Blazor ComponentBase类中获取数据,blazor,Blazor,每个Blazor组件都有一个方法OnInitializedAsync(),可以覆盖该方法。 对于任何调用来说,它似乎都是一个很好的地方,用于获取组件渲染期间应使用的数据,例如: protected override async Task OnInitializedAsync() { var dataForRendering = await SomeHttpClient.RetrieveSomeData(); } 但是,Blazor组件中有一个已知的行为,OnInitializedAsy

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

protected override async Task OnInitializedAsync()
{
    var dataForRendering = await SomeHttpClient.RetrieveSomeData();
}
但是,Blazor组件中有一个已知的行为,
OnInitializedAsync()
方法被触发两次。在中有关于如何处理的说明

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

然而,安告诉我们应该

删除
IComponentContext
的任何用法,并将预渲染期间不应运行的任何逻辑移动到
OnAfterRender
OnAfterRenderAsync

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

因此,问题是:

  • 如何避免现在执行“OnInitializedAsync()”时重复加载数据?两次调用数据服务器不是一个好的性能示例
  • 这样加载组件渲染的数据是个好主意吗?也许有更好的方法将数据传递给组件
  • 如果使用Blazor Server App,则会执行两次OnInitialized(异步)对,并启用预渲染。要禁用预渲染,应将_Host.cshtml文件中组件元素的属性渲染模式设置为“服务器”

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

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

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

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

    希望这有助于

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