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

React DND 16.0.1:如何获取被拖拽元素的放置坐标而非鼠标坐标

问题:React DND 16.0.1 获取拖拽元素自身坐标而非鼠标光标坐标

我在使用React DND 16.0.1开发垂直时间线拖拽功能,需要将元素拖拽到时间线后,根据被放置元素的像素坐标计算对应的时间。但目前获取到的始终是放置时的鼠标光标坐标,而非被拖拽元素自身的坐标。

我的核心需求是:用被放置元素的顶部位置来计算对应时间,因为元素高度会随“时长”变化,鼠标位置无法准确匹配元素的时间起点。

以下是我当前的实现代码:

计算本地偏移的函数

function calc_local_offset(monitor) {
    let offset= monitor.getClientOffset()
    const deltaX = offset.x - boundingBox.current.left
    const deltaY = offset.y - boundingBox.current.top
    return { x: deltaX, y: deltaY }
}

useDrop 相关代码

const [{ isOver, canDrop }, drop_ref] = useDrop({
    ...
    drop: (item, monitor) => onDrop({...item}, calc_local_offset(monitor)),
    collect: (monitor) => ({
        isOver: monitor.isOver(),
        canDrop: monitor.canDrop(),
    }),
    ...
})

放置区域与拖拽组件的补充代码

const boundingBox = useRef(null)

function combinedRef(el) {
    drop_ref(el);
    if (el) {
        boundingBox.current = el.getBoundingClientRect();
    }
}

return (
    <div className="work_day_workspace">
        <span className="workspace_header">{workspace.identifier}</span>
        <div ref={combinedRef} >
            {workspace.executions.map((execution) => {
                return (
                    <Execution execution={execution} />
                )
            })
            }
        </div>
    </div>
)

可拖拽组件 Execution

export const Execution = memo(function Execution({ execution }) {
  const [{ opacity }, drag] = useDrag(
    () => ({
       type: "execution",
       item: { execution },
       collect: (monitor) => ({
       opacity: monitor.isDragging() ? 0.4 : 1,
       item: monitor.getItem(),
      }),
    }),
  [execution],
 )

return (
   <div>
     .... 展示内容
   </div>
  )
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:42:38