You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Syncfusion Blazor中管理按钮组件的多点击事件

解决Blazor子按钮组件同时触发波纹效果与父组件事件的问题

你的问题核心在于:子组件的按钮点击事件只处理了波纹动画,没有触发父组件传入的OnClick回调。下面直接给你修正方案和详细解释:

修正后的子组件代码(PrimaryButton.razor)

<button type="button" class="@ButtonClass @RippleClass" @onclick="HandleButtonClick">@ButtonText</button>

@code {
    [Parameter] public string ButtonClass { get; set; }
    [Parameter] public string ButtonText { get; set; }
    [Parameter] public EventCallback OnClick { get; set; }

    private string RippleClass = "";

    private async Task HandleButtonClick()
    {
        // 1. 触发波纹效果
        RippleClass = "ripple";
        // 2. 触发父组件绑定的点击事件
        if (OnClick.HasDelegate)
        {
            await OnClick.InvokeAsync();
        }
        // 3. 等待500ms后移除波纹类
        await Task.Delay(500);
        RippleClass = "";
    }
}

关键改动说明

  1. 合并点击逻辑:把原来分开的波纹动画和父组件回调触发逻辑合并成一个方法,绑定到按钮@onclick上,确保点击时两个逻辑都执行。
  2. 替换Timer为Task.Delay:放弃原来的System.Timers.Timer,改用Task.Delay更适配Blazor的异步编程模型,不需要手动处理线程切换和状态更新,代码更简洁可靠。
  3. 增加回调存在性检查:用OnClick.HasDelegate判断父组件是否传入了回调,避免无意义的空调用。

EventCallback核心用法拆解

  • 子组件通过[Parameter]声明EventCallback类型参数,这是Blazor专门为组件间事件通信设计的类型,比普通委托更适配组件生命周期和UI更新机制。
  • 父组件直接将需要触发的方法绑定到子组件的OnClick参数上(比如你写的OnClick="@OpenModal")。
  • 子组件通过await OnClick.InvokeAsync(参数)触发父组件方法,不需要参数时可以不传或传null。
  • 必须用await等待回调执行,尤其是父组件方法为异步逻辑时,能保证执行顺序的正确性。

父组件代码无需修改

你当前的父组件绑定写法是正确的,子组件修正后,点击按钮就能同时触发波纹动画和模态框的打开/关闭逻辑。

内容的提问来源于stack exchange,提问作者jottin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:35:00