【问题标题】:StateHasChanged not detecting changes first timeStateHasChanged 第一次未检测到更改
【发布时间】:2020-06-23 02:41:25
【问题描述】:

似乎StateHasChanged() 仅在对任务执行等待操作后触发组件的重新渲染(找到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,但它破坏了我的其他功能,例如清除网格和显示搜索数据等。

【问题讨论】:

标签: c# rendering blazor


【解决方案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**
        }

【讨论】:

  • 它对我有用!但我仍然使用异步方法,我应该为该方法调用 await。所以我不明白那里发生了什么,但它有效。你能在回答中解释一下吗?
  • 因为组件是在退出方法时渲染的。如果您等待,它将在GetTestCouponGroupsfinished 之后重新呈现。
猜你喜欢
  • 2015-01-15
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 2015-07-20
相关资源
最近更新 更多