StateHasChanged首次未检测到更改

时间:2020-03-11 06:42:19

标签: c# rendering blazor

似乎StateHasChanged()仅在对Task(找到的here)进行等待操作之后才触发组件的重新渲染。

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

1 个答案:

答案 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**
        }