StateHasChanged 第一次没有检测到变化

Aar*_*rsh 5 c# rendering blazor

似乎StateHasChanged()只有在对 Task 执行 await 操作后才会触发组件的重新渲染(在此处找到)。

所以我只想StateHasChanged用于重新渲染而不是使用Task.delayor 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但它破坏了我的其他功能,例如清除网格和显示搜索数据等。

agu*_*ars 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**
        }
Run Code Online (Sandbox Code Playgroud)