dnd-kit 踩坑
小于 1 分钟约 244 字
@dnd-kit - 用于 React 的轻量级、模块化、高性能、可访问和可扩展的拖放工具包。
Context Provider
const SortableItem = (props: {
id: string
itemRender: () => ReactElement
}) => {
const { attributes, listeners, setNodeRef, transform, transition } =
useSortable({ id: props.id })
const style = {
transform: CSS.Transform.toString(transform),
transition: transition!,
cursor: 'move'
}
return (
<div
className="mr-2"
ref={setNodeRef}
style={{ ...style }}
{...attributes}
{...listeners}
>
{props.itemRender()}
</div>
)
}
踩坑
dnd kit 会将鼠标点击事件识别为拖拽事件
https://github.com/clauderic/dnd-kit/issues/1204
https://github.com/clauderic/dnd-kit/issues/893
需要注册一些传感器:
const sensor = useSensor(PointerSensor, {
activationConstraint: { distance: 10 }
})
条件拖拽
让元素在某些条件下允许排序:
const { attributes, listeners, setNodeRef, transform, transition } =
useSortable({ id: props.id, disabled: props.disabled })
video 元素无法被拖拽
外层包裹一个 div
。
<div
className={style.videoItem}
onMouseEnter={() => {
videoRef.current?.play()
}}
onMouseLeave={() => {
videoRef.current?.pause()
}}
>
<video
ref={videoRef}
src={props.resource.resourceUrl}
controls
className={style.video}
muted
loop
>
<track kind="captions" {...props} />
</video>
</div>
拖拽动画异常
排序策略
需要选择默认
无限拖拽出现滚动条
modifiers={[restrictToFirstScrollableAncestor]}
鼠标跟手
https://github.com/clauderic/dnd-kit/issues/122
https://github.com/clauderic/dnd-kit/pull/334
https://github.com/clauderic/dnd-kit/blob/master/stories/components/Draggable/DraggableOverlay.tsx