Elkjs Multiple Handles
This example demonstrates how to configure elkjs to use specific handles (called ‘ports’ in elkjs). This is helpful to reduce edge crossings and have more control over the layout. The important things to configure are unique ids for the handles / ports, the actual ports for elkjs with a correct side property and 'org.eclipse.elk.portConstraints' : 'FIXED_ORDER'
for all nodes.
import {
ReactFlow,
Controls,
Background,
MiniMap,
useNodesState,
useEdgesState,
ReactFlowProvider,
} from '@xyflow/react';
import '@xyflow/react/dist/style.css';
import ElkNode from './ElkNode';
import { nodes as initNodes } from './nodes';
import { edges as initEdges } from './edges';
import useLayoutNodes from './useLayoutNodes';
const nodeTypes = {
elk: ElkNode,
};
function App() {
const [nodes, , onNodesChange] = useNodesState(initNodes);
const [edges, , onEdgesChange] = useEdgesState(initEdges);
useLayoutNodes();
return (
<ReactFlow
nodes={nodes}
onNodesChange={onNodesChange}
edges={edges}
onEdgesChange={onEdgesChange}
fitView
nodeTypes={nodeTypes}
style={{ backgroundColor: "#F7F9FB" }}
>
<Background />
<Controls />
<MiniMap />
</ReactFlow>
);
}
export default () => (
<ReactFlowProvider>
<App />
</ReactFlowProvider>
);