Tree
Multiple-level structure list.
When To Use
Almost anything can be represented in a tree structure. Examples include directories, organization hierarchies, biological classifications, countries, etc. The Tree component is a way of representing the hierarchical relationship between these things. You can also expand, collapse, and select a treeNode within a Tree.
Examples
-
Basic ·
basic -
Controlled Tree ·
basic-controlled -
draggable ·
draggable -
load data asynchronously ·
dynamic -
Searchable ·
search -
Tree with line ·
line -
Customize Icon ·
customized-icon -
directory ·
directory -
Customize collapse/expand icon ·
switcher-icon -
Virtual scroll ·
virtual-scroll -
Scroll to nested node ·
scroll-to -
Block Node ·
block-node -
Custom semantic dom styling ·
style-class
API
Common props ref:Common props
Tree props
| Property | Description | Type | Default | Version | Global Config |
|---|---|---|---|---|---|
| allowDrop | Whether to allow dropping on the node | ({ dropNode, dropPosition }) => boolean | - | × | |
| autoExpandParent | Whether to automatically expand a parent treeNode | boolean | false | × | |
| blockNode | Whether treeNode fill remaining horizontal space | boolean | false | × | |
| checkable | Add a Checkbox before the treeNodes | boolean | false | × | |
| checkedKeys | (Controlled) Specifies the keys of the checked treeNodes (PS: When this specifies the key of a treeNode which is also a parent treeNode, all the children treeNodes of will be checked; and vice versa, when it specifies the key of a treeNode which is a child treeNode, its parent treeNode will also be checked. When checkable and checkStrictly is true, its object has checked and halfChecked property. Regardless of whether the child or parent treeNode is checked, they won't impact each other | string[] | {checked: string[], halfChecked: string[]} | [] | × | |
| checkStrictly | Check treeNode precisely; parent treeNode and children treeNodes are not associated | boolean | false | × | |
| classNames | Customize class for each semantic structure inside the component. Supports object or function. | Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string> | - | 6.0.0 | |
| defaultCheckedKeys | Specifies the keys of the default checked treeNodes | string[] | [] | × | |
| defaultExpandAll | Whether to expand all treeNodes by default | boolean | false | × | |
| defaultExpandedKeys | Specify the keys of the default expanded treeNodes | string[] | [] | × | |
| defaultExpandParent | If auto expand parent treeNodes when init | boolean | true | × | |
| defaultSelectedKeys | Specifies the keys of the default selected treeNodes | string[] | [] | × | |
| disabled | Whether the tree is disabled | boolean | false | × | |
| draggable | Specifies whether this Tree or the node is draggable. Use icon: false to disable drag handler icon | boolean | ((node: DataNode) => boolean) | { icon?: React.ReactNode | false, nodeDraggable?: (node: DataNode) => boolean } | false | config: 4.17.0 | × |
| expandedKeys | (Controlled) Specifies the keys of the expanded treeNodes | string[] | [] | × | |
| fieldNames | Customize node title, key, children field name | object | { title: title, key: key, children: children } | 4.17.0 | × |
| filterTreeNode | Defines a function to filter (highlight) treeNodes. When the function returns true, the corresponding treeNode will be highlighted | function(node) | - | × | |
| height | Config virtual scroll height. Will not support horizontal scroll when enabled | number | - | × | |
| icon | Insert a custom icon before the title. Need to set showIcon to true | ReactNode | (props) => ReactNode | - | × | |
| loadData | Load data asynchronously | function(node) | - | × | |
| loadedKeys | (Controlled) Set loaded tree nodes. Need to work with loadData | string[] | [] | × | |
| motion | Custom motion config for the tree | CSSMotionProps | - | × | |
| multiple | Allows selecting multiple treeNodes | boolean | false | × | |
Style on the root element, please use styles.root instead | CSSProperties | - | 4.20.0 | × | |
| selectable | Whether it can be selected | boolean | true | × | |
| selectedKeys | (Controlled) Specifies the keys of the selected treeNodes, multiple selection needs to set multiple to true | string[] | - | × | |
| showIcon | Controls whether to display the icon node (no default style) | boolean | false | × | |
| showLine | Shows a connecting line | boolean | {showLeafIcon: ReactNode | ((props: AntTreeNodeProps) => ReactNode)} | false | × | |
| styles | Customize inline style for each semantic structure inside the component. Supports object or function. | Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties> | - | 6.0.0 | |
| switcherIcon | Customize expand/collapse icons for tree nodes (Will not rotate automatically in showLine mode) | ReactNode | ((props: AntTreeNodeProps) => ReactNode) | - | renderProps: 4.20.0 | × |
| switcherLoadingIcon | Customize loading icons for tree nodes | ReactNode | - | 5.20.0 | × |
| titleRender | Customize tree node title render | (nodeData) => ReactNode | - | 4.5.0 | × |
| treeData | The treeNodes data Array, if set it then you need not to construct children TreeNode. (key should be unique across the whole array) | array<{ key, title, children, [disabled, selectable] }> | - | × | |
| virtual | Disable virtual scroll when set to false | boolean | true | 4.1.0 | × |
| onCheck | Callback function for when the onCheck event occurs | function(checkedKeys, e:{checked: boolean, checkedNodes, node, event, halfCheckedKeys}) | - | × | |
| onDoubleClick | Callback function for when the user double clicks a treeNode | function(event, node) | - | × | |
| onDragEnd | Callback function for when the onDragEnd event occurs | function({event, node}) | - | × | |
| onDragEnter | Callback function for when the onDragEnter event occurs | function({event, node, expandedKeys}) | - | × | |
| onDragLeave | Callback function for when the onDragLeave event occurs | function({event, node}) | - | × | |
| onDragOver | Callback function for when the onDragOver event occurs | function({event, node}) | - | × | |
| onDragStart | Callback function for when the onDragStart event occurs | function({event, node}) | - | × | |
| onDrop | Callback function for when the onDrop event occurs | function({event, node, dragNode, dragNodesKeys}) | - | × | |
| onExpand | Callback function for when a treeNode is expanded or collapsed | function(expandedKeys, {expanded: boolean, node}) | - | × | |
| onLoad | Callback function for when a treeNode is loaded | function(loadedKeys, {event, node}) | - | × | |
| onRightClick | Callback function for when the user right clicks a treeNode | function({event, node}) | - | × | |
| onSelect | Callback function for when the user clicks a treeNode | function(selectedKeys, e:{selected: boolean, selectedNodes, node, event}) | - | × |
TreeNode props
| Property | Description | Type | Default | |
|---|---|---|---|---|
| checkable | When Tree is checkable, set TreeNode display Checkbox or not | boolean | - | |
| disableCheckbox | Disables the checkbox of the treeNode | boolean | false | |
| disabled | Disables the treeNode | boolean | false | |
| icon | Customize icon. When you pass component, whose render will receive full TreeNode props as component props | ReactNode | (props) => ReactNode | - | |
| isLeaf | Determines if this is a leaf node (effective when loadData is specified). false will force the TreeNode to be treated as a parent node | boolean | - | |
| key | Used with (default)ExpandedKeys / (default)CheckedKeys / (default)SelectedKeys. P.S.: It must be unique in all of treeNodes of the tree | string | (internal calculated position of treeNode) | |
| selectable | Set whether the treeNode can be selected | boolean | true | |
| title | Title | ReactNode | --- |
DirectoryTree props
| Property | Description | Type | Default |
|---|---|---|---|
| expandAction | Directory opening logic, options: false | click | doubleClick | string | boolean | click |
Note
Before 3.4.0: The number of treeNodes can be very large, but when checkable=true, it will increase the compute time. So, we cache some calculations (e.g. this.treeNodesStates) to avoid double computing. But, this brings some restrictions. When you load treeNodes asynchronously, you should render tree like this:
{
this.state.treeData.length ? (
<Tree>
{this.state.treeData.map((data) => (
<TreeNode />
))}
</Tree>
) : (
'loading tree'
);
}
Tree Methods
| Name | Description |
|---|---|
| scrollTo({ key: string | number; align?: 'top' | 'bottom' | 'auto'; offset?: number; autoExpand?: boolean }) | Scroll to key item in virtual scroll. autoExpand expands the target node in uncontrolled mode |
Tree Hooks
Tree.useTree
type Tree.useTree = (treeData: DataNode[], config: { fieldNames?: FieldNames }) => TreeInstance
Provides Tree data utilities. getPath(key) returns the node entities from the root to the target node, which can be used to update expandedKeys in controlled mode.
getPath has a stable function identity and reads the latest treeData when called. If you memoize a value derived from getPath, include treeData and the lookup key in the dependency list because dependency tracking cannot observe the data captured inside getPath.
const { getPath } = Tree.useTree(treeData, {});
const path = useMemo(() => getPath(selectedKey), [getPath, selectedKey, treeData]);
Semantic DOM
| Semantic node | Native description | Version |
|---|---|---|
root | Root element with tree control base styles, layout and container control | 6.0.0 |
item | Item element with tree node base styles, drag state, role attributes, indentation, switcher, content wrapper and other node structure | 6.0.0 |
itemIcon | Icon element with tree node icon styles, size and state display | 6.0.0 |
itemTitle | Title element with tree node title text display styles and text content | 6.0.0 |
itemSwitcher | Switcher element with tree node expand/collapse button styles and background | 6.4.0 |
Semantic description source: vendor/components/tree/demo/_semantic.tsx
Design Token
Types, inheritance and declarations retain the pinned native source. Defaults are computed by the native theme and may be overridden by ConfigProvider; this table does not invent static defaults.
| Token | Type | Native description |
|---|---|---|
directoryNodeSelectedColor | string | Text color of selected directory node |
directoryNodeSelectedBg | string | Background color of selected directory node |
Declaration source: vendor/components/tree/style/index.ts
import type { CSSInterpolation, CSSObject } from '@ant-design/cssinjs';
import { Keyframes, unit } from '@ant-design/cssinjs';
import { getStyle as getCheckboxStyle } from '../../checkbox/style';
import { genFocusOutline, resetComponent } from '../../style';
import { genCollapseMotion } from '../../style/motion';
import type { AliasToken, CSSUtil, FullToken, GetDefaultToken } from '../../theme/internal';
import { genStyleHooks, mergeToken } from '../../theme/internal';
import { genDirectoryStyle } from './directory';
export interface TreeSharedToken {
/**
* @desc 节点标题高度
* @descEN Node title height
*/
titleHeight: number;
/**
* @desc 展开按钮宽度
* @descEN Switcher width of tree
*/
switcherSize?: number;
/**
* @desc 缩进宽度
* @descEN Indent width of tree
*/
indentSize?: number;
/**
* @desc 节点悬浮态背景色
* @descEN Background color of hovered node
*/
nodeHoverBg: string;
/**
* @desc 节点悬浮态态文字颜色
* @descEN Text color of hovered node
*/
nodeHoverColor: string;
/**
* @desc 节点选中态背景色
* @descEN Background color of selected node
*/
nodeSelectedBg: string;
/**
* @desc 节点选中态文字颜色
* @descEN Text color of selected node
*/
nodeSelectedColor: string;
}
export interface ComponentToken extends TreeSharedToken {
/**
* @desc 目录树节点选中文字颜色
* @descEN Text color of selected directory node
*/
directoryNodeSelectedColor: string;
/**
* @desc 目录树节点选中背景色
* @descEN Background color of selected directory node
*/
directoryNodeSelectedBg: string;
}
// =============================== Base ===============================
export type TreeToken = FullToken<'Tree'> & {
treeCls: string;
treeNodeCls: string;
treeNodePadding: number | string;
};
FAQ
Why defaultExpandAll not working on ajax data?
default prefix props only work when initializing. So defaultExpandAll has already been executed when ajax loads data. You can control expandedKeys or render the Tree when data is loaded to realize expanding all nodes.
Virtual scroll limitation
Virtual scroll only render items in visible region. Thus not support auto width (like long title with horizontal scroll).
What does disabled node work logic in the tree?
Tree change its data by conduction. Includes checked or auto expanded, it will conduction state to parent / children node until current node is disabled. So if a controlled node is disabled, it will only modify self state and not affect other nodes. For example, a parent node contains 3 child nodes and one of them is disabled. When check the parent node, it will only check rest 2 child nodes. As the same, when check these 2 child node, parent will be checked whatever checked state the disabled one is.
This conduction logic prevents modifying disabled parent checked state by checking children nodes, and users cannot modify directly with click which avoids interactive conflicts. If you want to modify this conduction logic, you can customize it with the checkStrictly prop.
Shared native props
Tips: The following generic properties apply to most antd components; those not supported are described separately.
| Property | Description | Type | Default |
|---|---|---|---|
| style | The additional style | CSSProperties | - |
| className | The additional css class | string | - |
| rootClassName | ClassName on the root element | string | - |
| autoFocus | Auto focus when component mounted, only effective for focusable elements like forms, links, etc. | boolean | false |
Install and reproduce an example
npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23
Use ConfigProvider and native App; configure dayjs locale separately. Each example lists its complete source files and additional pinned dependencies in View code. Example names select demos, not universal component props. See the resource setup guide for theme, locale and SSR.
Native type references
The source viewer includes unchanged native implementations and the following source declarations. Inherited types remain in their native packages. English source comments are preserved as code reference.
vendor/components/tree/DirectoryTree.tsxvendor/components/tree/Tree.tsxvendor/components/tree/index.tsxvendor/components/tree/style/index.tsvendor/components/tree/utils/dictUtil.tsvendor/components/tree/utils/dropIndicator.tsxvendor/components/tree/utils/iconUtil.tsx
Source and license
https://github.com/ant-design/ant-design/tree/4a39f54842eade4e565ab336ef6097cd7e723cdd
Original bilingual prose and executable examples are retained. Website-only embeds and token tables are expanded locally. Ant Design is MIT; separately listed dependency notices also apply. Upload previews block outbound requests and do not provide a backend.