返回顶部
r

react-flow-implementationReact Flow实现

Implements React Flow node-based UIs correctly using @xyflow/react. Use when building flow charts, diagrams, visual editors, or node-based applications with React. Covers nodes, edges, handles, custom components, state management, and viewport control.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.1.0
安全检测
已通过
117
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

react-flow-implementation

React Flow 实现

快速开始

tsx
import { ReactFlow, useNodesState, useEdgesState, addEdge } from @xyflow/react;
import @xyflow/react/dist/style.css;

const initialNodes = [
{ id: 1, position: { x: 0, y: 0 }, data: { label: 节点 1 } },
{ id: 2, position: { x: 200, y: 100 }, data: { label: 节点 2 } },
];

const initialEdges = [{ id: e1-2, source: 1, target: 2 }];

export default function Flow() {
const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);

const onConnect = useCallback(
(connection) => setEdges((eds) => addEdge(connection, eds)),
[setEdges]
);

return (


nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onConnect={onConnect}
fitView
/>

);
}

核心模式

TypeScript 类型

typescript
import type { Node, Edge, NodeProps, BuiltInNode } from @xyflow/react;

// 定义带数据形状的自定义节点类型
type CustomNode = Node<{ value: number; label: string }, custom>;

// 与内置节点组合
type MyNode = CustomNode | BuiltInNode;
type MyEdge = Edge<{ weight?: number }>;

// 在应用中使用
const [nodes, setNodes] = useNodesState(initialNodes);

自定义节点

tsx
import { memo } from react;
import { Handle, Position, type NodeProps } from @xyflow/react;

// 定义节点类型
type CounterNode = Node<{ count: number }, counter>;

// 始终使用 memo 包裹以提升性能
const CounterNode = memo(function CounterNode({ data, isConnectable }: NodeProps) {
return (
<>


计数: {data.count}
{/ nodrag 防止与按钮交互时拖动 /}




);
});

// 在 nodeTypes 中注册(在组件外部定义以避免重新渲染)
const nodeTypes = { counter: CounterNode };

// 在 ReactFlow 中使用

多个手柄

tsx
// 当节点有多个同类型手柄时使用手柄 ID

// 连接特定手柄
const edge = {
id: e1-2,
source: 1,
sourceHandle: a,
target: 2,
targetHandle: null
};

自定义边

tsx
import { BaseEdge, EdgeProps, getSmoothStepPath } from @xyflow/react;

function CustomEdge({ id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, data }: EdgeProps) {
const [edgePath, labelX, labelY] = getSmoothStepPath({
sourceX, sourceY, sourcePosition,
targetX, targetY, targetPosition,
});

return (
<>

{data?.label}

);
}

const edgeTypes = { custom: CustomEdge };

状态管理

受控模式(推荐用于生产环境)

tsx
// 带变更处理器的外部状态
const [nodes, setNodes] = useState(initialNodes);
const [edges, setEdges] = useState(initialEdges);

const onNodesChange = useCallback(
(changes) => setNodes((nds) => applyNodeChanges(changes, nds)),
[]
);

const onEdgesChange = useCallback(
(changes) => setEdges((eds) => applyEdgeChanges(changes, eds)),
[]
);

nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
/>

使用 useReactFlow

tsx
import { useReactFlow, ReactFlowProvider } from @xyflow/react;

function FlowControls() {
const {
getNodes, setNodes, addNodes, updateNodeData,
getEdges, setEdges, addEdges,
fitView, zoomIn, zoomOut, setViewport,
deleteElements, toObject,
} = useReactFlow();

const addNode = () => {
addNodes({ id: ${Date.now()}, position: { x: 100, y: 100 }, data: { label: 新建 } });
};

return ;
}

// 使用 useReactFlow 时必须包裹在 provider 中
function App() {
return (




);
}

更新节点数据

tsx
const { updateNodeData } = useReactFlow();

// 与现有数据合并
updateNodeData(nodeId, { label: 已更新 });

// 完全替换数据
updateNodeData(nodeId, { newField: value }, { replace: true });

视口与适配视图

tsx
// 初始渲染时适配

// 程序化控制
const { fitView, setViewport, getViewport, zoomTo } = useReactFlow();

// 适配到特定节点
fitView({ nodes: [{ id: 1 }, { id: 2 }], duration: 500 });

// 设置精确视口
setViewport({ x: 100, y: 100, zoom: 1.5 }, { duration: 300 });

连接验证

tsx
const isValidConnection = useCallback((connection: Connection) => {
// 阻止自连接
if (connection.source === connection.target) return false;

// 自定义验证逻辑
const sourceNode = getNode(connection.source);
const targetNode = getNode(connection.target);

return sourceNode?.type !== targetNode?.type;
}, []);

常用属性参考

tsx
// 核心数据
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}

// 自定义类型(在组件外部定义)
nodeTypes={nodeTypes}
edgeTypes={edgeTypes}

// 连接
onConnect={onConnect}
connectionMode={ConnectionMode.Loose} // 允许目标到目标连接
isValidConnection={isValidConnection}

// 视口
fitView
minZoom={0.1}
maxZoom={4}
defaultViewport={{ x: 0, y: 0, zoom: 1 }}

// 交互
nodesDraggable={true}
nodesConnectable={true}
elementsSelectable={true}
panOnDrag={true}
zoomOnScroll={true}

// 附加组件



交互 CSS 类

类名效果
nodrag点击元素时阻止拖动
nowheel
阻止滚轮缩放 | | nopan | 阻止从元素开始平移 | | nokey | 阻止键盘事件(在输入框上使用) |

附加组件

参见 ADDITIONAL_COMPONENTS.md 了解 MiniMap、Controls、Background、NodeToolbar、NodeResizer。

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 react-flow-implementation-1775978052 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 react-flow-implementation-1775978052 技能

通过命令行安装

skillhub install react-flow-implementation-1775978052

下载

⬇ 下载 react-flow-implementation v1.1.0(免费)

文件大小: 5.28 KB | 发布时间: 2026-4-13 11:44

v1.1.0 最新 2026-4-13 11:44
react-flow-implementation 1.1.0 – Improved docs and usage guidance

- Added comprehensive usage instructions for building node-based UIs with @xyflow/react.
- Examples now cover custom nodes, edges, multiple handles, and TypeScript type safety.
- State management patterns clarified (controlled vs. hook-based).
- Guidance for viewport control, connection validation, and React Flow props.
- Included concise CSS and integration tips for robust real-world implementations.

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部