A high-performance virtualized tree view component using React and Konva, designed for displaying large tree structures efficiently.
npm install react-virtualized-treeThis package requires the following peer dependencies:
npm install react react-dom konva react-konva react-konva-utilsimport React from 'react';
import { VirtualizedTree, NodeData } from 'react-virtualized-tree';
const data: NodeData = {
id: 1,
x: 0,
y: 0,
level: 0,
index: 0,
hasChildren: true,
isExpanded: true,
nodeInfo: { name: 'CEO' },
children: [
{
id: 2,
x: 0,
y: 0,
level: 1,
index: 0,
hasChildren: false,
isExpanded: false,
nodeInfo: { name: 'CTO' },
children: []
}
]
};
function App() {
return (
<div style={{ width: '100vw', height: '100vh' }}>
<VirtualizedTree
data={data}
zoom={true}
pan={true}
onNodeClick={(node) => console.log('Clicked:', node)}
/>
</div>
);
}
export default App;| Prop | Type | Default | Description |
|---|---|---|---|
data |
NodeData<T> |
Required | The root node of the tree data. |
canvasWidth |
number |
window.innerWidth |
Width of the canvas stage. |
canvasHeight |
number |
window.innerHeight |
Height of the canvas stage. |
zoom |
boolean |
true |
Enable or disable zoom controls. |
pan |
boolean |
true |
Enable or disable panning. |
onNodeClick |
(node: NodeData<T>) => void |
undefined |
Callback function when a node is clicked. |
NodeElement |
React.ComponentType<{ node: NodeData<T> }> |
DefaultNodeElement |
Custom component to render for each node. |
horizontalMargin |
number |
150 |
Horizontal spacing between nodes. |
verticalMargin |
number |
100 |
Vertical spacing between levels. |
nodeWidth |
number |
40 |
Width of the node (used for line calculation). |
nodeHeight |
number |
40 |
Height of the node (used for line calculation). |
interface NodeData<T = any> {
id: number;
x: number; // Position on X axis
y: number; // Position on Y axis
level: number; // Level of the node
index: number; // Index of the node
hasChildren: boolean;
isExpanded: boolean;
nodeInfo: T; // Your custom data here
children?: NodeData<T>[];
}You can provide a custom component to render nodes using the NodeElement prop.
import { NodeData } from 'react-virtualized-tree';
const CustomNode = ({ node }: { node: NodeData<{ name: string; role: string }> }) => {
return (
<div style={{
border: '1px solid #ccc',
padding: '10px',
background: 'white',
borderRadius: '5px',
textAlign: 'center'
}}>
<strong>{node.nodeInfo.name}</strong>
<div>{node.nodeInfo.role}</div>
</div>
);
};
// Usage
<VirtualizedTree
data={data}
NodeElement={CustomNode}
/>MIT