Draggable 是一个组件,提供设置跨浏览器(包括 IE)可自定义的拖拽图像以及拖拽事件传输数据的方法。它将拖拽手柄与待拖拽元素解耦:通过包裹将成为拖拽手柄的组件并提供要拖拽元素的 DOM ID 来使用它。

请注意,拖拽手柄需要声明 draggable="true" 属性,并将 Draggable 的 onDraggableStart 和 onDraggableEnd 事件处理程序分别绑定到其自身的 onDragStart 和 onDragEnd。Draggable 负责设置拖拽图像和传输数据的逻辑,但不关心创建实际的可拖拽 DOM 元素。

Props

该组件接受以下 props:

appendToOwnerDocument: boolean

是否将克隆的元素追加到 ownerDocument body 中。默认情况下,通过 ID 获取的元素会追加到元素的包装器中。

  • Required: No
  • Default: false

elementId: string

在拖拽时克隆的元素的 HTML id。

  • Required: Yes

onDragEnd: ( event: DragEvent ) => void

拖拽结束时调用的函数。此回调接收来自 dragend 事件的 event 对象作为其第一个参数。

  • Required: No
  • Default: noop

onDragOver: ( event: DragEvent ) => void

当被拖拽的元素拖过有效放置目标时调用的函数。此回调接收来自 dragover 事件的 event 对象作为其第一个参数。

  • Required: No
  • Default: noop

onDragStart: ( event: DragEvent ) => void

拖拽开始时调用的函数。此回调接收来自 dragstart 事件的 event 对象作为其第一个参数。

  • Required: No
  • Default: noop

transferData: unknown

附加到拖放事件的任意数据对象。

  • Required: Yes

Usage

import { Draggable, Panel, PanelBody } from '@wordpress/components';
import { Icon, more } from '@wordpress/icons';

const MyDraggable = () => (
    <div id="draggable-panel">
        <Panel header="Draggable panel">
            <PanelBody>
                <Draggable elementId="draggable-panel" transferData={ {} }>
                    { ( { onDraggableStart, onDraggableEnd } ) => (
                        <div
                            className="example-drag-handle"
                            draggable
                            onDragStart={ onDraggableStart }
                            onDragEnd={ onDraggableEnd }
                        >
                            <Icon icon={ more } />
                        </div>
                    ) }
                </Draggable>
            </PanelBody>
        </Panel>
    </div>
);

如果您也想调用自己的 dragstart / dragend 事件处理程序,可以将它们传递给 Draggable,它会在执行完自身逻辑后负责调用它们:

import { Draggable, Panel, PanelBody } from '@wordpress/components';
import { Icon, more } from '@wordpress/icons';

const MyDraggable = ( { onDragStart, onDragEnd } ) => (
    <div id="draggable-panel">
        <Panel header="Draggable panel">
            <PanelBody>
                <Draggable
                    elementId="draggable-panel"
                    transferData={ {} }
                    onDragStart={ onDragStart }
                    onDragEnd={ onDragEnd }
                >
                    { ( { onDraggableStart, onDraggableEnd } ) => (
                        <div
                            className="example-drag-handle"
                            draggable
                            onDragStart={ onDraggableStart }
                            onDragEnd={ onDraggableEnd }
                        >
                            <Icon icon={ more } />
                        </div>
                    ) }
                </Draggable>
            </PanelBody>
        </Panel>
    </div>
);