似乎StateHasChanged()
仅在对Task(找到的here)进行等待操作之后才触发组件的重新渲染。
所以我只想使用StateHasChanged
进行重新渲染,而不要使用Task.delay
或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**
}
在这里,我使用的加载程序是通过IsBusy
激活的。但是如代码中所述,第一次调用StateHasChanged
时不起作用。
但是它第二次渲染组件。
我使用过Task.Delay
,但是它破坏了我的其他功能,例如清除网格和显示搜索到的数据等。
答案 0 :(得分:1)
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**
}