Architectural guidance for building node-based UIs with React Flow. Use when designing flow-based applications, making decisions about state management, integration patterns, or evaluating whether React Flow fits a use case.
@xyflow/system(原生 TypeScript)
├── 核心算法(边路径、边界、视口)
├── xypanzoom(基于 d3 的平移/缩放)
├── xydrag、xyhandle、xyminimap、xyresizer
└── 共享类型
@xyflow/react(依赖 @xyflow/system)
├── React 组件和钩子
├── 用于状态管理的 Zustand 存储
└── 框架特定集成
@xyflow/svelte(依赖 @xyflow/system)
└── Svelte 组件和存储
含义:核心逻辑与框架无关。在贡献或调试时,检查问题是在 @xyflow/system 还是框架特定包中。
tsx
// 使用 useNodesState/useEdgesState 进行原型开发
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
优点:简单,样板代码少
缺点:状态局限于组件树
tsx
// Zustand 存储示例
import { create } from zustand;
interface FlowStore {
nodes: Node[];
edges: Edge[];
setNodes: (nodes: Node[]) => void;
onNodesChange: OnNodesChange;
}
const useFlowStore = create
nodes: initialNodes,
edges: initialEdges,
setNodes: (nodes) => set({ nodes }),
onNodesChange: (changes) => {
set({ nodes: applyNodeChanges(changes, get().nodes) });
},
}));
// 在组件中
function Flow() {
const { nodes, edges, onNodesChange } = useFlowStore();
return
}
优点:状态随处可访问,更易持久化/同步
缺点:需要更多设置,需谨慎优化选择器
tsx
// 通过选择器连接
const nodes = useSelector(selectNodes);
const dispatch = useDispatch();
const onNodesChange = useCallback((changes: NodeChange[]) => {
dispatch(nodesChanged(changes));
}, [dispatch]);
用户输入 → 变更事件 → 归约器/处理器 → 状态更新 → 重新渲染
↓
[拖拽节点] → onNodesChange → applyNodeChanges → setNodes → ReactFlow
↓
[连接] → onConnect → addEdge → setEdges → ReactFlow
↓
[删除] → onNodesDelete → deleteElements → setNodes/setEdges → ReactFlow
tsx
// 包含子节点的父节点
const nodes = [
{
id: group-1,
type: group,
position: { x: 0, y: 0 },
style: { width: 300, height: 200 },
},
{
id: child-1,
parentId: group-1, // 关键:父节点引用
extent: parent, // 关键:限制在父节点内
position: { x: 10, y: 30 }, // 相对于父节点
data: { label: 子节点 },
},
];
注意事项:
tsx
// 保存视口状态
const { toObject, setViewport } = useReactFlow();
const handleSave = () => {
const flow = toObject();
// flow.nodes, flow.edges, flow.viewport
localStorage.setItem(flow, JSON.stringify(flow));
};
const handleRestore = () => {
const flow = JSON.parse(localStorage.getItem(flow));
setNodes(flow.nodes);
setEdges(flow.edges);
setViewport(flow.viewport);
};
tsx
// 从 API 加载
useEffect(() => {
fetch(/api/flow)
.then(r => r.json())
.then(({ nodes, edges }) => {
setNodes(nodes);
setEdges(edges);
});
}, []);
// 防抖自动保存
const debouncedSave = useMemo(
() => debounce((nodes, edges) => {
fetch(/api/flow, {
method: POST,
body: JSON.stringify({ nodes, edges }),
});
}, 1000),
[]
);
useEffect(() => {
debouncedSave(nodes, edges);
}, [nodes, edges]);
tsx
import dagre from dagre;
function getLayoutedElements(nodes: Node[], edges: Edge[]) {
const g = new dagre.graphlib.Graph();
g.setGraph({ rankdir: TB });
g.setDefaultEdgeLabel(() => ({}));
nodes.forEach((node) => {
g.setNode(node.id, { width: 150, height: 50 });
});
edges.forEach((edge) => {
g.setEdge(edge.source, edge.target);
});
dagre.layout(g);
return {
nodes: nodes.map((node) => {
const pos = g.node(node.id);
return { ...node, position: { x: pos.x, y: pos.y } };
}),
edges,
};
}
| 节点数 | 策略 |
|---|---|
| < 100 | 默认设置 |
| 100-500 |
tsx
onlyRenderVisibleElements={true}
// 减少节点边框半径(改善相交计算)
nodeExtent={[[-1000, -1000], [1000, 1000]]}
// 禁用不需要的功能
elementsSelectable={false}
panOnDrag={false}
zoomOnScroll={false}
/>
| 受控 | 非受控 |
|---|---|
| 更多样板代码 | 代码更少 |
| 完全状态控制 |
| 严格(默认) | 宽松 |
|---|---|
| 仅源 → 目标 | 任意手柄 → 任意手柄 |
| 行为可预测 |
tsx
| 默认边 | 自定义边 |
|---|---|
| 快速渲染 | 更多控制 |
| 有限样式 |
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 react-flow-architecture-1775982608 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 react-flow-architecture-1775982608 技能
skillhub install react-flow-architecture-1775982608
文件大小: 3.52 KB | 发布时间: 2026-4-13 11:44