Blazor 拖放:ondragleave 在放置时触发,而不是 ondrop

问题描述 投票:0回答:1

我是一个菜鸟,试图在我的 blazor 8 混合应用程序中实现拖放,但 ondrop 事件没有触发。相反,当我释放鼠标时,ondragleave 会被触发。

我们有两张桌子:

面板 A - 有 -> 代理

面板 B -有-> DataComponent

我们可以通过拖动代理或组件来启动拖动操作。这会将底层数据传递给面板 B,面板 B 管理由组件呈现的数据列表

应允许在面板 B 内或面板 B 中的组件顶部放置,以便对元素进行重新排序。

如上所述,B面板的ondrop事件永远不会被触发,而是ondragleave。

-我已在所有组件上设置 @ondragenter:preventDefault="true" 和 @ondragover:preventDefault="true"。

-有人建议我阻止组件的渲染,因为这可能会导致 DOM 树在拖动操作期间失去对面板 B 实例的跟踪,但我不确定如何在不破坏所有内容的情况下做到这一点。通过检查 Edge 上的元素,似乎面板实际上并未重新渲染,所以我不知道该怎么做。 我还实现了一个上下文菜单,但这应该与这里无关。

B 组:

<div id="-panel-wrapper">
    
    <div id="@DropZoneId"
         @onclick="Click"

         @ondragover:preventDefault="true"
         @ondrop="args => OnDrop(args)"

         @ondragenter="args => OnDragEnter(args)"
         @ondragleave="args => OnDragLeave(args)"

         @oncontextmenu:preventDefault="true"
         @oncontextmenu="args => ContextMenu(args)"
    >   

        @*  
            Iterate over the items in the  panel.
        *@        
        @for (int i = 0; i < _dataItems.Count; i++)
        {
            Data item = _dataItems[i];
           
            <div class="Data-row">

                <div class="row-index"> @(i + 1) </div>
                <div class="row-item">
                    <CascadingValue Value="@this">
                        @{  
                            // Generate a unique id for the component.
                            string id = "fic-" + i.ToString();
                        }

                        @* Render the data. *@
                        <DataComponent @ref="_reference" Id="@id"
                            Data="@item" ContextMenuCallback="ContextMenuInst"
                            @oncontextmenu:stopPropagation="true"
                        >
                        </DataComponent>
                        
                    </CascadingValue>
                </div>
            </div>
        }
    </div>

</div>

数据组件:

<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)"
    @ondragend="args => OnDragEnd(args)"
    
>
    @* @ondragenter="args => OnDragEnter(args)"
    @ondragleave="args => OnDragLeave(args)"
    @ondrop="args => OnDrop(args)" *@
</div>

实际的组件事件处理程序被委托给 State 对象。

如有任何提示,我们将不胜感激。 预先感谢!

javascript c# blazor drag-and-drop dom-events
1个回答
0
投票

正如 @SMSTJ 在评论中提到的,

ondragover="event.preventDefault();"
而不是
@ondragover:preventDefault="true"
(或
@ondragover:preventDefault
)解决了问题。

在大多数组件中,用于拖放 API 的 Blazor 界面按预期工作,但这里需要 JS 互操作。我的猜测是,这可能是由于 Blazor 丢失了组件引用的踪迹。

© www.soinside.com 2019 - 2024. All rights reserved.