我正在构建一个组件,该组件允许用户通过拖放构建图形。有一个节点井,他们可以在其中拖出新节点,他们可以在画布周围拖动节点等。
现在,我需要允许他们通过从一个节点的输出拖动到下一个节点的输入端来创建边。严格来说,这不是拖放操作,因为可拖动对象保持不动,而是显示一条源自可拖动对象并填充在光标下的线,直到最终,当用户将鼠标悬停在活动目标上时释放,边缘完成。
拖放似乎可以完成我想要的几乎所有事情。它具有悬停信号,当符合条件的 Draggable 正在拖动时突出显示放置目标,等等。有两件事我不知道该怎么做。一是完全停止可拖动的移动。我可以通过放置元素的两个副本来欺骗它,一个在另一个下面,然后禁用拖动预览,但如果有一个简单的标志会更好。
另一个似乎更像是一个表演者。collect 函数不会在我拖动时连续触发事件(我知道,设计使然)。我需要一些能触发 onMouseMove 的东西来不断更新这条线。由于拖放确实做了一些我需要的东西,而且我已经承担了依赖它的大小成本,所以重用它会很棒。
到目前为止,我最好的想法是在 上安装一个 onMouseMove 处理程序beginDrag
并清理线上,在 上endDrag
建立任何新的边缘drop
。不幸的是,我认为有些东西正在阻止 mousemove 事件的传播,因为即使我在开始拖动时确实在此处输入了 beginDrag,我的处理程序也不会触发。
let mouseMoveHandler = (ev: JQueryMouseEventObject) => {
console.log("Draw a line from ", node.position, " to ", { x: ev.clientX, y: ev.clientY });
};
console.log("Dragging");
$("body").on("mousemove", mouseMoveHandler);
return { id, node, mouseMoveHandler: mouseMoveHandler};
},
endDrag: ({id, node}, monitor: DragSourceMonitor) => {
const item = monitor.getItem() as any;
$("body").off("mousemove", item.mouseMoveHandler);
}