如何知道何时必须在Blazor中调用StateHasChanged((?
在一个典型的场景中,假设我正在加载数据,并且我希望在加载时禁用"加载"按钮。所以,也许我有以下几点。我看到的行为是,除非我在第17行调用base.StateHasChanged()
,否则按钮将在初始加载期间显示为已启用;然而,在那之后,如果我单击"加载",该按钮将在加载时显示为禁用状态,然后按预期启用。那么,为什么在来自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;
}
}
当您想要更新ChileContent的状态时,您应该在它的父组件中调用StateHasChanged((。
与OnClick等用户启动的事件不同,OnInitializedAsync似乎不允许组件在等待时重新提交。因此,在OnInitializedAsync内部调用StateHasChanged似乎是必要的,除非Blazor在检查未来版本中的更改时变得更加复杂。