交互系统详解
交互由 @xyflow/system(d3-zoom、d3-drag 等)处理指针/触摸,结果写回 store(位置、viewport、connection、selection)。
1. 平移与缩放(Pan / Zoom)
| 能力 | 说明 |
|---|---|
| 滚轮缩放 | 可配置 zoomOnScroll、修饰键 |
| 拖动画布 | 空白处拖动 |
fitView | 根据 nodes 边界算 viewport |
逻辑在 XYPanZoom;React 层监听事件更新 viewport state。
2. 节点拖拽
| 点 | 说明 |
|---|---|
nodesDraggable | 总开关 |
| 拖拽产生 position change | 进入 onNodesChange |
| 子节点 | parentId + extent 限制范围 |
| 多选拖拽 | 与 selection 联动 |
XYDrag 负责指针捕获与增量;避免在 onNodeDrag 里做重计算。
3. 选择与框选
- 点击:选中单节点/边,
multiSelectionKeyCode多选。 - 框选:拖拽矩形,更新 selection。
- 键盘:删除、方向键 nudge(若启用)。
4. 连线(Connect)
text
pointerDown on Handle → connection 状态
→ pointerMove 更新临时线
→ pointerUp on 合法 Handle → onConnect → 新 edgeisValidConnection 可拒绝连接;connectionMode 影响是否允许多 handle。
5. 事件与 props
用户钩子:onNodeClick、onPaneClick、onConnect、onNodesDelete 等。
应在文档中区分 「变更回调」(onNodesChange)与 「交互回调」(点击)。
6. 总结
交互 = system 算几何 + store 记状态 + React 触发重绘;自定义行为优先用 props 回调,勿直接改内部 DOM。