Tree
A tree provides a list of data.
This page has not yet been finished and is being worked on. In the meantime, you can view the stories.
Node 0
Node 1
Node 2
Node 2-0
Node 2-1
Node 2-1-0
import * as React from 'react';
import { Tree, TreeNode } from '@itwin/itwinui-react';
import { SvgPlaceholder } from '@itwin/itwinui-icons-react';
export default () => {
const [expandedNodes, setExpandedNodes] = React.useState({
'Node-2': true,
'Node-2-1': true,
'Node-3': true,
});
const onNodeExpanded = React.useCallback((nodeId, isExpanded) => {
if (isExpanded) {
setExpandedNodes((oldExpanded) => ({ ...oldExpanded, [nodeId]: true }));
} else {
setExpandedNodes((oldExpanded) => ({
...oldExpanded,
[nodeId]: false,
}));
}
}, []);
const generateItem = React.useCallback(
(index, parentNode = '', depth = 0) => {
const keyValue = parentNode ? `${parentNode}-${index}` : `${index}`;
return {
id: `Node-${keyValue}`,
label: `Node ${keyValue}`,
sublabel: `Sublabel for Node ${keyValue}`,
subItems:
depth < 10
? Array(Math.round(index % 5))
.fill(null)
.map((_, index) => generateItem(index, keyValue, depth + 1))
: [],
};
},
[],
);
const data = React.useMemo(
() =>
Array(3)
.fill(null)
.map((_, index) => generateItem(index)),
[generateItem],
);
const getNode = React.useCallback(
(node) => {
return {
subNodes: node.subItems,
nodeId: node.id,
node: node,
isExpanded: expandedNodes[node.id],
hasSubNodes: node.subItems.length > 0,
};
},
[expandedNodes],
);
return (
<Tree
className='demo-tree'
data={data}
getNode={getNode}
nodeRenderer={React.useCallback(
({ node, ...rest }) => (
<TreeNode
label={node.label}
sublabel={node.sublabel}
onExpanded={onNodeExpanded}
icon={<SvgPlaceholder />}
{...rest}
/>
),
[onNodeExpanded],
)}
/>
);
};
A tree can be used to organize data in an application specific way, or it can be used to sort, filter, group, or search data as the user deems appropriate. Each line of data level may begin with an eye icon for toggling its visibility. In this context, this icon is called specialty checkbox.
Size
There are 2 different sizes available. The default size should suffice for most cases. When a smaller version of the tree is needed, use size="small"
.
Node 0
Node 1
Node 2
Node 2-0
Node 2-1
Node 2-1-0
import * as React from 'react';
import { Tree, TreeNode } from '@itwin/itwinui-react';
import { SvgPlaceholder } from '@itwin/itwinui-icons-react';
export default () => {
const [expandedNodes, setExpandedNodes] = React.useState({
'Node-2': true,
'Node-2-1': true,
'Node-3': true,
});
const onNodeExpanded = React.useCallback((nodeId, isExpanded) => {
if (isExpanded) {
setExpandedNodes((oldExpanded) => ({ ...oldExpanded, [nodeId]: true }));
} else {
setExpandedNodes((oldExpanded) => ({
...oldExpanded,
[nodeId]: false,
}));
}
}, []);
const generateItem = React.useCallback(
(index, parentNode = '', depth = 0) => {
const keyValue = parentNode ? `${parentNode}-${index}` : `${index}`;
return {
id: `Node-${keyValue}`,
label: `Node ${keyValue}`,
subItems:
depth < 10
? Array(Math.round(index % 5))
.fill(null)
.map((_, index) => generateItem(index, keyValue, depth + 1))
: [],
};
},
[],
);
const data = React.useMemo(
() =>
Array(3)
.fill(null)
.map((_, index) => generateItem(index)),
[generateItem],
);
const getNode = React.useCallback(
(node) => {
return {
subNodes: node.subItems,
nodeId: node.id,
node: node,
isExpanded: expandedNodes[node.id],
hasSubNodes: node.subItems.length > 0,
};
},
[expandedNodes],
);
return (
<Tree
className='demo-tree'
data={data}
size='small'
getNode={getNode}
nodeRenderer={React.useCallback(
({ node, ...rest }) => (
<TreeNode
label={node.label}
onExpanded={onNodeExpanded}
icon={<SvgPlaceholder />}
{...rest}
/>
),
[onNodeExpanded],
)}
/>
);
};
Props
Prop | Description | Default |
---|---|---|
size | Modify size of the tree. "default" | "small" | 'default' |
nodeRenderer | Render function that should return the node element.
Recommended to use TreeNode component.
Must be memoized.(props: NodeRenderProps<T>) => Element | |
data | Array of custom data used for TreeNodes inside Tree .T[] | |
getNode | Function that maps your data entry to NodeData that has all info about the node state.
It will be used to render a tree node in nodeRenderer .
Must be memoized.(node: T) => NodeData<T> | |
enableVirtualization | Virtualization is used to have a better performance with a lot of nodes. When enabled, Tree DOM structure will change - it will have a wrapper div to which className and style will be applied.
@betaboolean | false |
id | string | |
className | string | |
style | CSSProperties |