如何在 Blazor 服务器应用程序中停止事件传播

Ven*_*nky 27 .net-core blazor blazor-server-side matblazor

我正在使用Grid.Blazor库在 Blazor 应用程序上渲染服务器端网格。其中一列有一个带有单击事件的按钮。因此,当单击按钮时,网格行事件也会与按钮单击事件一起触发。我想停止事件传播并只让按钮单击事件触发。

网格:

  <GridComponent @ref="_gridComponent" T="QuickLists" Grid="@_grid"  OnRowClicked="@(async (item) => await ExerciseDetails(item))"></GridComponent>


Action<IGridColumnCollection<QuickExcerciseLists>> columns = c =>
        {
            c.Add().Titled("Actions").RenderComponentAs(typeof(ChildComponent)).SetWidth("5%");
            c.Add(o => o.Name, comparer).Titled("Name").SetWidth("10%");
            c.Add(o => o.Age, comparer).Titled("Age").SetWidth("15%");
            c.Add(o => o.Address, comparer).Titled("Address").RenderComponentAs<MatTooltip>().SetWidth("15%");
        };
Run Code Online (Sandbox Code Playgroud)

自定义列组件:

<MatBlazor.MatButton Icon="@MatIconNames.Remove_red_eye" @onclick="@ShowData" @onclick:stopPropagation="true"></MatBlazor.MatButton>
Run Code Online (Sandbox Code Playgroud)

我尝试传递@onclick:stopPropagation子按钮组件。但下面给出了编译错误。

该组件的组件参数“onclick”使用两次或多次。参数必须是唯一的(不区分大小写)。组件参数“onclick”由“@onclick:stopPropagation”指令属性生成。

我正在运行.Net core 3.1.201。非常感谢任何帮助。

pfe*_*eds 27

如果它有帮助,并添加到 @Ivan 为 MatBlazor MatButton/MatIconButton 所做的评论,这似乎对我不起作用,我使用了以下解决方法:

<div @onclick:stopPropagation="true" @onclick:preventDefault="true">
  <MatButton OnClick="@DoSomething" @ref="MyButton">Do it!</MatButton>
</div>
Run Code Online (Sandbox Code Playgroud)

我需要同时使用 stopPropagation 和 PreventDefault。我必须使用 div 包装器,因为 MatButton 不允许我添加多个 onclick。

  • 这个解决方案也对我的案例有帮助。我有一个 MudBlazor `&lt;MudNavGroup&gt;` 标签,我已经为其连接了一个 `onclick` 事件处理程序。 (2认同)

小智 5

我在使用扩展器时也遇到了类似的问题。我希望能够单击扩展器行内的按钮,而无需扩展该行。我能够通过在 C# 代码中使用@onmousedown并在窗口事件调用中使用 onclick来实现此目的

 <a class="text-primary" @onmousedown="() => MyModal.Open()" onclick="event.stopPropagation()"> Button </a>
Run Code Online (Sandbox Code Playgroud)


Iva*_*van 0

我在使用 Table 时遇到了完全相同的问题。看来现在 MatBlazor 按钮有办法停止传播:OnClickStopPropagation="true"

以下代码对我有用,带有MatIconButtonMatButton

<MatBlazor.MatButton Icon="@MatIconNames.Remove_red_eye" OnClick="@ShowData" OnClickStopPropagation="true"></MatBlazor.MatButton>
Run Code Online (Sandbox Code Playgroud)