【问题标题】:Blazor StateHasChanged does not work as expected [duplicate]Blazor StateHasChanged 无法按预期工作 [重复]
【发布时间】:2020-04-23 04:54:15
【问题描述】:

我使用布尔属性在用户点击按钮后禁用它,这样点击就不会发生两次。

 private bool DisablePlaceOrderButton { get; set; } = false;
 private void PlaceOrder_Clicked()
    {
        DisablePlaceOrderButton = true;
        StateHasChanged();
        if (cart.Lines.Count() == 0)
        {
            DisablePlaceOrderButton = false;
            return;
        }
        ...
}

按钮设计如下:

<button @onclick="@PlaceOrder_Clicked" disabled="@DisablePlaceOrderButton">Place Order</button>

但这不起作用,并且仅在 PlaceOrder 方法完成执行后才禁用按钮。 我对 ajax 指示器有同样的问题,在方法执行后,应该显示,完成后应该隐藏,使用 if 块。 在这两种情况下,statehaschanged 都没有效果。我使用 Blazor Server 端预览版 9。如何使这些工作?

【问题讨论】:

  • StateHasChanged 通知组件其状态已更改,但它不呈现组件。组件将决定何时渲染自己。你不能在同步方法中做到这一点,你应该异步你的代码让组件有机会渲染。

标签: blazor


【解决方案1】:

请阅读来自 mars 的 agua 发表的评论,并按照此代码示例查看它是如何工作的...当您单击按钮时,将调用 DisablePlaceOrder 方法,标题文本会更改以反映正在进行的操作,在此期间按钮被禁用。这发生在 3 秒内,包括重新渲染控件以反映视觉变化。请注意,不会调用 StateHasChanged。

在实际应用中,当然不会使用Task.Delay方法,而是调用做密集工作的方法……

<button type="button" @onclick="@PlaceOrder_Clicked" disabled="@DisablePlaceOrderButton">@Title</button>

@code{
    private bool DisablePlaceOrderButton { get; set; } = false;

    public string Title { get; set; } = "Place Order";

    private async Task PlaceOrder_Clicked()
    {

        await DisablePlaceOrder();

        //if (cart.Lines.Count() == 0)
        //{
        DisablePlaceOrderButton = false;
        Title = "Place Order";
        // return;
        //}

    }

    async Task DisablePlaceOrder()
    {
        DisablePlaceOrderButton = true;
        Title = "Wait...";
        await Task.Delay(3000); 

    }
}

【讨论】:

  • 你的代码的主要部分是Task.Delay(),所以我没有创建DisablePlaceOrder()方法,而是用原来的PlaceOrder_Clicked()和StateHasChanged()替换为:await Task。延迟(1000);一切都很好。
  • 但这不是正确的做法,对吧?因为 statehaschagned() 应该重新渲染组件。
猜你喜欢
  • 2021-09-03
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多