我如何知道何时需要在 Blazor 中调用 StateHasChanged()?

How do I know when I need to call StateHasChanged() in Blazor?

我怎么知道什么时候必须在 Blazor 中调用 StateHasChanged()?

在典型情况下,假设我正在加载数据并且我希望 "Load" 按钮在加载时被禁用。所以也许我有以下内容。我看到的行为是按钮将在初始加载期间显示为已启用,除非我在第 17 行调用 base.StateHasChanged();但是,在那之后,如果我单击 "load",该按钮将在加载时显示为禁用状态,然后按预期变为启用状态。那么为什么在 OnInitializedAsync 的调用中这样不起作用?是否有其他方法可以让我省略 StateHasChanged()?

@inject HttpClient Http
<div class="my-component">
    <button disabled="@(LoadingTask?.IsCompleted == false)" @onclick="LoadData">Load</button>
    ...
</div>

@code {
  protected override async Task OnInitializedAsync() => await LoadData();

  private Task<Thing[]>? LoadingTask { get; set; }
  private Thing[] Data { get; set; } = new Thing[0];

  private async Task LoadData()
  {
    LoadingTask = Http.GetJsonAsync<Thing[]>(url);

    // Line 17: I shouldn't need to call base.StateHasChanged() here, right?

    funds = await LoadingTask;
    HasLoaded = true;
  }

}

当您想更新子内容的状态时,您应该在其父组件中调用 StateHasChanged()。

似乎 OnInitializedAsync 不允许组件在等待时重新呈现,这与用户启动的事件(如 OnClick)不同。因此,似乎有必要在 OnInitializedAsync 中调用 StateHasChanged ,除非 Blazor 在何时检查未来版本中的更改方面变得更加复杂。