Aar*_*rsh 5 c# rendering blazor
似乎StateHasChanged()
只有在对 Task 执行 await 操作后才会触发组件的重新渲染(在此处找到)。
所以我只想StateHasChanged
用于重新渲染而不是使用Task.delay
or Task.Run
。
这是我的代码:
protected async Task ClearSearch()
{
SearchTestCoupon = new Mechanic.Shared.TestCouponSearch();
IsBusy = true;
TestCouponGroups = new List<Mechanic.Shared.TestCouponGroup>();
StateHasChanged(); // << -------- **FIRST TIME**
//await Task.Delay(TimeSpan.FromSeconds(1));
await GetTestCouponGroups(SearchTestCoupon);
}
protected async Task GetTestCouponGroups(object args)
{
TestCouponGroups = await TestCouponService.GetTestCouponGroupsAsync(SearchTestCoupon);
IsRowSelected = false;
IsBusy = false;
StateHasChanged(); // << -------- **SECOND TIME**
}
Run Code Online (Sandbox Code Playgroud)
在这里,我使用加载器,它使用IsBusy
. 但是StateHasChanged
在代码中提到的第一次调用时它不起作用。
但它第二次按预期呈现组件。
我已经使用过,Task.Delay
但它破坏了我的其他功能,例如清除网格和显示搜索数据等。
StateHasChanged
不重新渲染组件,当事件委托 ( OnClick, OnMouseMouve...
) 完成时组件会重新渲染。
因此,在您的情况下,如果您想在第一个组件上重新渲染组件,StateHasChanged
您的代码应该是:
protected void ClearSearch()
{
SearchTestCoupon = new Mechanic.Shared.TestCouponSearch();
IsBusy = true;
TestCouponGroups = new List<Mechanic.Shared.TestCouponGroup>();
GetTestCouponGroups(SearchTestCoupon); // don't await
StateHasChanged(); // << -------- **FIRST TIME**
}
protected async Task GetTestCouponGroups(object args)
{
TestCouponGroups = await TestCouponService.GetTestCouponGroupsAsync(SearchTestCoupon);
IsRowSelected = false;
IsBusy = false;
StateHasChanged(); // << -------- **SECOND TIME**
}
Run Code Online (Sandbox Code Playgroud)