Blazor StateHasChanged 未按预期工作

标签 blazor

<分区>

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

 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 block 。 在这两种情况下,statehaschanged 都没有效果。我使用 Blazor 服务器端预览版 9。如何使这些工作正常?

最佳答案

请阅读 agua 来自 mars 的评论,并按照此代码示例查看它是如何工作的...当您单击按钮时,会调用 DisablePlaceOrder 方法,标题文本会更改以反射(reflect)正在进行的操作 Action ,在此期间按钮被禁用。这发生在 3 秒的跨度内,包括重新呈现控件以反射(reflect)视觉变化。请注意,不会调用 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); 

    }
}

关于Blazor StateHasChanged 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59598676/

相关文章:

blazor - Blazor WASM 项目中的哪些文件夹具有 "meaning"?

c# - 将Blazor从3.1升级到5.0时出错 "does not have a property matching the name ' PreferExactMatches'“

javascript - 如何在 Blazor Server 应用程序中使用 Flip 计数器插件

blazor - 如何防止 Blazor EventCallback 将所选项目重置为默认值

asp.net - 有没有办法在 blazor 中查看 razor 文件的 RenderTreeBuilder 版本?

c# - 将具有类型参数的复杂类型作为 CascadeParameter 传递给子 RenderFragment

.net-core - 在 Blazor 客户端中,如何为界面创建组件?

asp.net-core - 使用 .NET Core Blazor 将(实时)视频从服务器流式传输到客户端

Blazor - 全局对象 - 使用 SessionStorage?

azure-active-directory - 使用 Azure AD 进行 Blazor 身份验证 - 检索用户角色