Usage with TypeScript
React Flow is written in TypeScript, so you don't need to install the types separately. In this section we setup a basic flow with the corresponding types.
Usage
import { useState, useCallback } from 'react';
import ReactFlow, {
addEdge,
FitViewOptions,
applyNodeChanges,
applyEdgeChanges,
Node,
Edge,
OnNodesChange,
OnEdgesChange,
OnConnect,
DefaultEdgeOptions,
NodeTypes
} from 'reactflow';
import CustomNode from './CustomNode';
const initialNodes: Node[] = [
{ id: '1', data: { label: 'Node 1' }, position: { x: 5, y: 5 } },
{ id: '2', data: { label: 'Node 2' }, position: { x: 5, y: 100 } },
];
const initialEdges: Edge[] = [{ id: 'e1-2', source: '1', target: '2' }];
const fitViewOptions: FitViewOptions = {
padding: 0.2,
};
const defaultEdgeOptions: DefaultEdgeOptions = {
animated: true,
};
const nodeTypes: NodeTypes = {
custom: CustomNode,
};
function Flow() {
const [nodes, setNodes] = useState<Node[]>(initialNodes);
const [edges, setEdges] = useState<Edge[]>(initialEdges);
const onNodesChange: OnNodesChange = useCallback(
(changes) => setNodes((nds) => applyNodeChanges(changes, nds)),
[setNodes],
);
const onEdgesChange: OnEdgesChange = useCallback(
(changes) => setEdges((eds) => applyEdgeChanges(changes, eds)),
[setEdges],
);
const onConnect: OnConnect = useCallback(
(connection) => setEdges((eds) => addEdge(connection, eds)),
[setEdges],
);
return (
<ReactFlow
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onConnect={onConnect}
fitView
fitViewOptions={fitViewOptions}
defaultEdgeOptions={defaultEdgeOptions}
nodeTypes={nodeTypes}
/>
);
}
Custom Nodes
When you are working with custom nodes you can define the data type by passing a parameter:
import { Node, NodeProps } from 'reactflow';
type NodeData = {
value: number;
};
type CustomNode = Node<NodeData>;
function MyCustomNode({ data }: NodeProps<NodeData>) {
return <div>A big number: {data.value}</div>;
}
You can also pass your custom node data type to any function or hook that returns nodes, for example the useReactFlow
hook:
const { getNodes, getEdges } = useReactFlow<NodeData, EdgeData>();