导航类 · Tree
树形控件
树型结构列表。

代码演示

如何引入

基本用法

最简单的用法,默认为单选模式,每一级菜单项均可选择。

多选

设置 multiple,可以进行多选。多选情况下所有子项都被选择时,自动勾选显示其父项。

可搜索的

通过设置 filterTreeNode 属性可支持搜索功能。默认对 label 值进行搜索,可通过 treeNodeFilterProp 更改。 如果只希望展示过滤后的结果,可以设置 showFilteredOnly

简单 JSON 格式的数据

可以通过 treeDataSimpleJson 传入 JSON 形式的 treeNodes 数据。此时 key-value 键值对中的 key 值将作为 treeNodekeylabelvalue 值将作为 treeNodevalue。返回值为包含选中节点的 JSON 数据。

行显示节点

可以通过设置 blockNode 使节点显示为整行,此时悬浮选中高亮状态都会显示整行。默认打开。 关闭时只高亮节点 label。

自定义节点内容

treeNode 的 label 属性支持传入 ReactNode 来自定义显示的节点内容。注意如果设置 filterTreeNode 开启搜索,默认是对 label 的值进行搜索,当 label 为节点时,需要自定义 filterTreeNode 的函数来满足搜索需求。
v>=1.6.0的版本中,你也可以使用 renderLabel 来传入自定义的渲染方法,此时搜索值仍为treeData中的相应的label属性。
过长省略。在v>=1.6.0的版本中,可以使用 renderLabel 来实现文本过长省略的效果。

自定义图标

通过设置 icon 属性可添加自定义图标。

目录树模式

通过设置 directory 属性可显示为目录树模式。目录树模式下自带目录图标,可以通过自定义图标覆盖。

禁用

可以使用 disableStrictly 来开启严格禁用。开启严格禁用后,当节点是 disabled 的时候,则不能通过子级或者父级的关系改变选中状态。

节点选中关系

版本:>= 2.5.0
多选时,可以使用 checkRelation 来设置节点选中关系的类型,可选:'related'(默认)、'unRelated'。当选中关系为 'unRelated',意味着节点之间的选中互不影响。

默认展开

defaultExpandAllexpandAll 均可以设置 Tree 的默认展开/收起状态。二者的区别是,defaultExpandAll 只在初始化时生效,而 expandAll 不仅会在初始化时生效,当数据(treeData/treeDataSimpleJson)发生动态更新时,expandAll 也仍然生效。
其中,expandAll 是从 1.30.0 开始支持的。
在下面的 demo 中,点击按钮更新 TreeData 后,defaultExpandAll 失效,expandAll 仍然生效。

受控

传入 value 时即为受控组件,可以配合 onChange 使用。

自动展开父节点

在展开受控的情况下,当开启了 autoExpandParent ,如果想要收起父元素,则需要把它的所有子元素均收起后才可以。默认情况下,autoExpandParent 为 false,即:父元素收起不受到子元素的影响。

虚拟化

列表虚拟化,用于大量树节点的情况。开启后,动画效果将被关闭。
virtualize 是一个包含下列值的对象:
  • height: 高度值,如果为 string 必须有计算高度才能被渲染出来,即其父节点有 offsetHeight
  • width: 宽度值,默认 100%
  • itemSize: 每行的treeNode的高度,必传
如果带搜索框,建议开启 showFilteredOnly 减少多余节点的渲染。

动态更新数据

异步加载数据

通过设置 loadData 可以动态加载数据,此时需要在数据中传入 isLeaf 标明叶子节点。

可拖拽的Tree

v>=1.8.0
通过设置 draggable 配合 onDrop 可以实现 Tree 节点的拖拽。 目前不支持虚拟化

高级定制

版本 v>=1.7.0
Tree 组件的 api 支持了大部分的渲染需求,但是如果有非常特殊的定制要求的话,可以使用 renderFullLabel 来接管整行 option 的渲染效果。
注意事项
如果开启了虚拟化,需要将 style (虚拟化相关样式)赋予给渲染的 DOM 节点
这里给几个常见的高级用法的 demo。
第一个是针对 “希望只有叶子节点可以选中,父节点只起到分组作用” 的场景。
  • 你只需要渲染叶子节点前的 Checkbox,并且点击父节点时不触发选中,点击叶子节点触发。
  • 同时开启 leafOnly 可以使 onChange 的回调入参都是叶子节点。
    ⚠️:renderFullLabel 只接管了渲染效果,并不影响内部的数据逻辑。但是你可以选取需要的逻辑进行渲染,或者配合受控来实现更复杂的需求。
第二个是针对 “希望只有叶子节点可以单选,父节点只起到分组作用” 的场景。
  • 你只需要点击父节点时不触发选中,点击叶子节点触发。
第三个是针对 “单选选中父节点同时也高亮子节点” 的场景。

可拖拽的高级定制

我们从 1.27.0 版本开始支持可拖拽(draggable)和高级定制(renderFullLabel)同时使用,在该版本之前,并不支持二者同时使用。

API参考

Tree

属性说明类型默认值版本
autoExpandParent是否自动展开父节点,默认为 false,当组件初次挂载时为 truebooleanfalse0.34.0
autoExpandWhenDragEnter是否允许拖拽到节点上时自动展开改节点booleantrue1.8.0
blockNode行显示节点booleantrue-
checkRelation多选时,节点之间选中状态的关系,可选:'related'、'unRelated'string'related'2.5.0
className类名string--
defaultExpandAll设置在初始化时是否展开所有节点。而如果后续数据(treeData/treeDataSimpleJson)发生改变,这个 api 是无法影响节点的默认展开情况的,如果有这个需要可以使用 expandAllbooleanfalse-
defaultExpandedKeys默认展开的节点,显示其直接子级string[]--
defaultValue指定默认选中的条目string | number | TreeNode | (string | number | TreeNode)[]--
directory目录树模式booleanfalse-
disableStrictly当节点的disabled状态确定时,不可通过子级或者父级的关系选中booleanfalse1.4.0
disabled禁用整个树,不可选择booleanfalse0.32.0
draggable是否允许拖拽booleanfalse1.8.0
emptyContent当搜索无结果时展示的内容ReactNode暂无数据0.32.0
expandAction展开逻辑,可选 false, 'click', 'doubleClick'。默认值为 false,即仅当点击展开按钮时才会展开boolean | stringfalse0.35.0
expandAll设置是否默认展开所有节点,若后续数据(treeData/treeDataSimpleJson)发生改变,默认展开情况也是会受到这个 api 影响的booleanfalse1.30.0
expandedKeys(受控)展开的节点,默认展开节点显示其直接子级string[]--
filterTreeNode是否根据输入项进行筛选,默认用 treeNodeFilterProp 的值作为要筛选的 TreeNode 的属性值boolean | ((inputValue: string, treeNodeString: string) => boolean)false-
hideDraggingNode是否隐藏正在拖拽的节点的 dragImgbooleanfalse1.8.0
icon自定义图标ReactNode--
labelEllipsis是否开启label的超出省略,默认虚拟化状态开启,如果有其他省略需求可以设置关闭booleanfalse|true(virtualized)1.8.0
leafOnly多选模式下是否开启 onChange 回调入参及展示标签只有叶子节点booleanfalse1.18.0
loadData异步加载数据,需要返回一个Promise(treeNode?: TreeNode) => Promise< void >-1.0.0
loadedKeys(受控)已经加载的节点,配合 loadData 使用string[]-1.0.0
motion是否开启动画booleantrue-
multiple是否支持多选booleanfalse-
renderDraggingNode自定义正在拖拽节点的 dragImg 的 Html 元素(nodeInstance: HTMLElement, node: TreeNode) => HTMLElement-1.8.0
renderFullLabel完全自定义label的渲染函数(data: object) => ReactNode-1.7.0
renderLabel自定义label的渲染函数(label: ReactNode, data: TreeNode) => ReactNode-1.6.0
searchClassName搜索框的 className 属性string--
searchPlaceholder搜索框默认文字string--
searchRender自定义搜索框的渲染方法,为 false 时可以隐藏组件的搜索框(V>=1.0.0)((searchRenderProps: object) => ReactNode) | false-0.35.0
searchStyle搜索框的样式CSSProperties--
showClear支持清除搜索框booleantrue0.35.0
showFilteredOnly搜索状态下是否只展示过滤后的结果booleanfalse0.32.0
style样式CSSProperties--
treeDatatreeNodes 数据,如果设置则不需要手动构造 TreeNode 节点(key值在整个树范围内唯一)TreeNode[][]-
treeDataSimpleJson简单 JSON 形式的 treeNodes 数据,如果设置则不需要手动构造 TreeNode 节点,返回值为包含选中节点的Json数据TreeDataSimpleJson{}-
treeNodeFilterProp搜索时输入项过滤对应的 treeNode 属性stringlabel-
value当前选中的节点的value值,传入该值时将作为受控组件string | number | TreeNode | (string | number | TreeNode)[]--
virtualize列表虚拟化,用于大量树节点的情况,由 height, width, itemSize 组成,参考 Virtualize Object。开启后将关闭动画效果。VirtualizeObj-0.32.0
onChange选中树节点时调用此函数,默认返回值为当前所有选中项的value值(value?: string | number | TreeNode | (string | number | TreeNode)[]) => void--
onChangeWithObject是否将选中项 option 的其他属性作为回调。设为 true 时,onChange 的入参类型会从 string 变为 object: { value, label, ...rest }。此时如果是受控,也需要把 value 设置成 object,且必须含有 value 的键值;defaultValue同理。booleanfalse-
onDoubleClick双击事件的回调(e: MouseEvent, node: TreeNode) => void-0.35.0
onDragEndonDragEnd 事件回调(dragProps: object) => void-1.8.0
onDragEnteronDragEnter 事件回调(dragEnterProps: object) => void-1.8.0
onDragLeaveonDragLeave 事件回调(dragProps: object) => void-1.8.0
onDragOveronDragOver 事件回调(dragProps: object) => void-1.8.0
onDragStartonDragStart 事件回调(dragProps: object) => void-1.8.0
onDroponDrop 事件回调(onDragProps: object) => void-1.8.0
onExpand展示节点时调用(expandedKeys: string[], {expanded: boolean, node: TreeNode}) => void--
onLoad节点加载完毕时触发的回调(loadedKeys: Set, treeNode: TreeNode) => void-1.0.0
onContextMenu右键点击的回调(e: MouseEvent, node: TreeNode) => void-0.35.0
onSearch文本框值变化时回调(sunInput: string) => void--
onSelect被选中时调用,返回值为当前事件选项的key值(selectedKey:string, selected: bool, selectedNode: TreeNode) => void--

TreeNode

不同 TreeNode 的 key 值要求必填且唯一。label 允许重复。v>=1.7.0 之前 value 值要求必须必填且唯一。 v>=1.7.0 之后 value 值非必填。此时 onChange, value, defaultValue 及 onChangeWithObject 中所取的 value 属性值将改为 key 值。 为了保证行为的符合预期,treeData 中的 value 值或者全部不填写,或者全部填写且唯一,不建议混写。
属性说明类型默认值
value属性值string|number-
label展示的文本string|ReactNode-
icon自定义图标ReactNode-
disabled是否禁用booleanfalse
keyrequired且要求唯一string-
isLeaf设置节点为叶子节点,在异步加载数据的情况即传入 loadData 时有效 v>=1.0.0boolean-

Virtualize Object

itemSize 必传。
属性说明类型默认值
height高度值,如果为 string 必须保证有计算高度,即其父节点有 offsetHeightnumber|string'100%'
itemSize每行的treeNode的高度,必传number-
width宽度值number|string'100%'

Ref 方法

  • search(sugInput) => void

Accessibility

ARIA

  • Tree 支持传入 aria-label 来表示该 Tree 作用;
  • Tree 会自动为每个子节点分别设置 aria-disabledaria-checkedaria-selectedaria-level 来表明节点状态及层级;
  • Tree 会自动为对应部分分别设置 roletreetreeitem
示例:

设计变量

© 2021 Semi Design. All rights reserved.

京ICP备19058139号-13浙公网安备 33011002016131号

Designed & Developed with love by Douyin FE & MED