ReactFlow PaneClick 与 SelectionOnDrag 冲突问题记录
问题描述
在使用 ReactFlow 时,当开启 selectionOnDrag 属性时,发现 onPaneClick 事件无法正常触发。这是因为在触控板操作中,拖拽操作会优先触发 selection 行为,导致 onPaneClick 事件被干扰或无法触发。
问题代码
// 原始配置
const reactFlowConfigProps = {
selectionOnDrag: true,
onPaneClick: (e) => {
handleNodeContextMenuClose();
handlePaneContextMenuClose();
onPaneClick(e);
}
}
原因分析
- ReactFlow 的
selectionOnDrag功能会在拖拽时创建一个选择框 - 在触控板操作中,轻微的移动也会被识别为拖拽操作
- 这导致
onPaneClick事件被 selection 行为覆盖或干扰 - 目前 ReactFlow 官方尚未提供
selectionOnDragThreshold这样的配置项来控制拖拽的灵敏度
解决方案
使用 onClick 事件替代 onPaneClick,并通过检查事件目标元素是否为 pane 来判断是否触发相应的处理逻辑:
const reactFlowConfigProps = {
selectionOnDrag: true,
onClick: (e) => {
const target = e.target as HTMLElement;
if (target.classList.contains('react-flow__pane')) {
handleNodeContextMenuClose();
handlePaneContextMenuClose();
onPaneClick(e);
}
}
}
注意事项
- 这个解决方案是一个临时的变通方案
- 需要确保事件目标元素包含
react-flow__pane类名 - 如果 ReactFlow 后续版本添加了
selectionOnDragThreshold配置,可以考虑使用官方提供的解决方案