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

Blazor 8 Hybrid拖拽异常:ondrop未触发,释放鼠标触发ondragleave

Blazor 8 Hybrid拖拽ondrop未触发问题解决建议

1. 启用DataComponent的放置事件绑定

你当前注释掉了DataComponent的ondrop、ondragleave事件,要在组件上实现放置/重排序,必须启用这些事件,并确保@ondragover:preventDefault="true"和@ondragenter:preventDefault="true"生效。修改DataComponent代码如下:

<div class="@State.ContextClass()" id="@Id"
    draggable="@State.Draggable"
    @oncontextmenu:preventDefault="true"
    @oncontextmenu:stopPropagation="true"
    @oncontextmenu="args => OnContextMenu((args, this))"

    @ondragenter:preventDefault="true"
    @ondragover:preventDefault="true"

    @ondragstart="args => OnDragStart(args)"
    @ondragenter="args => OnDragEnter(args)"
    @ondragleave="args => OnDragLeave(args)"
    @ondrop="args => OnDrop(args)"
    @ondragend="args => OnDragEnd(args)"
>
</div>

2. 必须在DragStart中设置拖拽数据

浏览器拖拽机制要求dragstart事件中必须通过DataTransfer传递数据,否则会阻止drop事件触发。在你的OnDragStart方法中添加数据传递逻辑:

void OnDragStart(DragEventArgs args)
{
    // 传递数据的唯一标识,比如数据项的Id
    args.DataTransfer.SetData("text/plain", State.Data.Id.ToString());
    // 其他拖拽初始化逻辑
}

3. 修复循环渲染的组件稳定性

在Panel B的@for循环中添加@key绑定数据项的唯一标识,避免Blazor在列表更新时重新创建组件实例,确保拖拽期间DOM元素的连续性:

@for (int i = 0; i < _dataItems.Count; i++)
{
    Data item = _dataItems[i];
    <div class="Data-row" @key="item.Id"> <!-- 添加@key绑定唯一标识 -->
        <div class="row-index"> @(i + 1) </div>
        <div class="row-item">
            <CascadingValue Value="@this">
                @{  
                    string id = "fic-" + i.ToString();
                }
                <DataComponent @ref="_reference" Id="@id"
                    Data="@item" ContextMenuCallback="ContextMenuInst"
                    @oncontextmenu:stopPropagation="true"
                >
                </DataComponent>
            </CascadingValue>
        </div>
    </div>
}

4. 修正DragLeave的误触发逻辑

ondragleave会在鼠标进入子元素时触发(而非真正离开父容器),可以通过计数器判断是否真的离开了DropZone:

private int _dragEnterCounter = 0;

void OnDragEnter(DragEventArgs args)
{
    _dragEnterCounter++;
    // 你的进入逻辑
}

void OnDragLeave(DragEventArgs args)
{
    _dragEnterCounter--;
    if (_dragEnterCounter == 0)
    {
        // 只有计数器归0时,才执行真正的离开逻辑
    }
}

5. 验证事件传播设置

  • 如果需要在DataComponent和Panel B的DropZone都响应drop,不要在DataComponent的ondrop中设置stopPropagation,除非你只想让组件单独处理放置逻辑。
  • 确认所有需要接收放置的元素都正确设置了@ondragover:preventDefault="true",这是触发drop的必要条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:07:53