输入类 · TreeSelect
树选择器
树选择器用于多层级树形数据的结构化展示 & 选取,例如显示文件夹与文件的列表、显示组织架构成员列表等等。

代码演示

如何引入

基本用法

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

多选

设置 multiple,可以进行多选。多选情况下所有子项都被选择时,自动勾选显示其父项。
通过 leafOnly 属性,可以设置只展示叶子节点,同时 onChange 的回调入参也会只有叶子节点的值。

限制标签展示数量

在多选的场景中,利用 maxTagCount 可以限制展示的标签数量,超出部分将以 +N 的方式展示。
使用 showRestTagsPopover (>= v2.22.0) 可以设置在超出 maxTagCount 后,hover +N 是否显示 Popover,默认为 false。并且,还可以在 restTagsPopoverProps 属性中配置 Popover。

可搜索的

通过设置 filterTreeNode 属性可支持搜索功能。默认对 label 值进行搜索,可通过 treeNodeFilterProp 更改。
如果只希望展示过滤后的结果,可以设置 showFilteredOnly
如果想要获取搜索结果的具体信息,可使用 onSearch 回调函数,函数具体参数见 API 列表。

远程搜索

通过设置 remote 属性可启用远程搜索。开启后,输入时不会执行本地过滤,而是仅触发 onSearch 回调,用户可自行处理远程数据获取并更新 treeData

搜索框位置

可以使用 searchPosition 来设置搜索框的位置,可选: dropdown(默认)、trigger
当输入框位于 trigger 时:
  1. 搜索框占位符由 placeholder 控制;
  2. showClear=true 时,点击输入框的清空按钮,将同时清空 inputValue 和 value。

Trigger 内多行换行(triggerTagWrap)

当你在 多选 + 搜索框位于 trigger 的场景下,选择了较多项或输入较长文本时,默认 trigger 可能会更倾向于保持单行展示。
通过设置 triggerTagWrap={true},可以让 trigger 内的已选标签支持自动换行(多行展示)。

尺寸大小

可以通过 size 设置尺寸大小,可选: 'small'、'default'、'large'

默认展开

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

禁用

严格禁用

可以使用 disableStrictly 来开启严格禁用。开启严格禁用后,当节点是 disabled 的时候,则不能通过子级或者父级的关系改变选中状态。
以下面的 demo 为例,节点"中国"开启了严格禁用,因此,当我们改变其父节点"亚洲"的选中状态时,也不会影响到节点"中国"的选中状态。

受控

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

节点选中关系

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

开启搜索的展开受控

传入 expandedKeys 时即为展开受控组件,可以配合 onExpand 使用。当展开受控时,如果开启 filterTreeNode 并进行搜索是不会再自动展开节点的,此时,节点的展开完全由 expandedKeys 来控制。 你可以利用 onSearch 的入参 filteredExpandedKeys(version: >= 2.6.0) 来实现展开受控时的搜索展开效果。

虚拟化

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

动态更新数据

异步加载数据

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

自定义 Trigger

如果默认的触发器样式满足不了你的需求,可以用 triggerRender 自定义选择框的展示。
triggerRender 入参如下:

自定义渲染已选项

你可以通过 renderSelectedItem 自定义选择框中已选项标签的渲染结构。
  • 单选时 renderSelectedItem(treeNode: TreeNodeData) => content:ReactNode
  • 多选时 renderSelectedItem(treeNode: TreeNodeData, { index:number, onClose:function }) => { isRenderInTag:bool, content:ReactNode }
    • isRenderInTag 为 true 时,会自动将 content 包裹在 Tag 中渲染(带有背景色以及关闭按钮)
    • isRenderInTag 为 false 时,将直接渲染返回的 content

API参考

TreeSelect

属性说明类型默认值
arrowIcon自定义右侧下拉箭头Icon,当showClear开关打开且当前有选中值时,hover会优先显示clear iconReactNode
autoAdjustOverflow浮层被遮挡时是否自动调整方向(暂时仅支持竖直方向,且插入的父级为 body)booleantrue
autoExpandParent是否自动展开父节点booleanfalse
autoMergeValue设置自动合并 value。具体而言是,开启后,当某个父节点被选中时,value 将不包括该节点的子孙节点。(在leafOnly为false的情况下生效)。v2.61.0 后提供booleantrue
borderless无边框模式,v2.33.0后提供booleanfalse
checkRelation多选时,节点之间选中状态的关系,可选:'related'、'unRelated'。v2.5.0后提供string'related'
className选择框的 className 属性string-
clearIcon可用于自定义清除按钮, showClear为true时有效。v2.25.0后提供ReactNode-
clickToHide选择后是否自动关闭下拉弹层,仅单选模式有效booleantrue
clickTriggerToHide面板打开状态下,点击 Trigger 后是否关闭面板。v2.32.0后提供booleantrue
defaultExpandAll设置在初始化时是否展开所有节点。而如果后续数据(treeData)发生改变,这个 api 是无法影响节点的展开情况的,如果有这个需要可以使用 expandAllbooleanfalse
defaultExpandedKeys默认展开的节点,显示其直接子级string[]-
defaultOpen默认展开下拉菜单booleanfalse
defaultValue指定默认选中的条目
ValueType
-
disabled是否禁用booleanfalse
disableStrictly是否严格禁用booleanfalse
dropdownClassName下拉菜单的 className 属性string-
dropdownMatchSelectWidth下拉菜单最小宽度是否等于Selectbooleantrue
dropdownMargin下拉菜单计算溢出时的增加的冗余值,详见issue#549,作用同 Tooltip margin。v2.25.0后提供object|number
dropdownStyle下拉菜单的样式CSSProperties-
emptyContent当搜索无结果时展示的内容ReactNode暂无数据
expandAction展开逻辑,可选 false, 'click', 'doubleClick'。默认值为 false,即仅当点击展开按钮时才会展开boolean | stringfalse
expandAll设置是否默认展开所有节点,若后续数据(treeData)发生改变,默认的展开情况也是会受到这个 api 影响的booleanfalse
expandedKeys(受控)展开的节点,默认展开节点显示其直接子级string[]-
expandIcon自定义展开图标,使用示例ReactNode | (props: expandProps)=>ReactNode-
keyMaps自定义节点中 key、label、value 的字段。v2.47.0后提供。如果 keyMaps 中设置 label 的自定义名称并且开启了搜索,为保证搜索正确,需要将 treeNodeFilterProp 设置为 treeData 的键之一或者通过 filterTreeNode 自定义搜索函数object-
filterTreeNode是否根据输入项进行筛选,默认用 treeNodeFilterProp 的值作为要筛选的 TreeNodeData 的属性值, data 参数自 v2.28.0 开始提供boolean|
Function
false
remote是否启用远程搜索。开启后,输入时跳过本地过滤,仅触发 onSearch 回调,用户可自行处理远程数据获取并更新 treeDatabooleanfalse
getPopupContainer指定父级 DOM,弹层将会渲染至该 DOM 中,自定义需要设置 position: relative 这会改变浮层 DOM 树位置,但不会改变视图渲染位置。function():HTMLElement-
labelEllipsis是否开启label的超出省略,默认虚拟化状态下开启booleanfalse|true(虚拟化)
leafOnly多选模式下是否开启 onChange 回调入参及展示标签只有叶子节点booleanfalse
loadData异步加载数据,需要返回一个Promise(treeNode: TreeNodeData) => Promise-
loadedKeys(受控)已经加载的节点,配合 loadData 使用Set< string >-
maxTagCount最多显示多少个 tagnumber-
motionExpand是否开启选项树节点动画booleantrue
multiple是否支持多选booleanfalse
optionListStyleoptionList的样式CSSProperties-
outerBottomSlot渲染在弹出层底部,与 optionList 平级的自定义 slotReactNode-
outerTopSlot渲染在弹出层顶部,与 optionList 平级的自定义 slot,注意如果开启了 filterTreeNode 会取代搜索框,可以通过 search 方法来自行处理ReactNode-
placeholder选择框默认文字string-
position下拉菜单位置,可选值参考 Tooltip position。v2.25.0后提供stringbottomLeft
prefix前缀标签ReactNode-
preventScroll指示浏览器是否应滚动文档以显示新聚焦的元素,作用于组件内的 focus 方法boolean-
renderFullLabel完全自定义label的渲染函数,入参及用法详见(obj) => ReactNode-
renderLabel自定义label的渲染函数,searchWord 参数自 2.65.0 开始支持。入参及用法详见
(label, data, searchWord) => ReactNode
-
renderSelectedItem自定义渲染已选项Function-
restTagsPopoverPropsPopover 的配置属性,可以控制 position、zIndex、trigger 等,具体参考Popover 。v2.22.0后提供PopoverProps{}
searchAutoFocus搜索框自动聚焦booleanfalse
searchPlaceholder搜索框默认文字string-
searchPosition设置搜索框的位置,可选: dropdowntriggerstringdropdown
triggerTagWrap是否允许在 trigger 内将多选标签换行展示。仅在 multiplefilterTreeNode 开启、并且 searchPosition="trigger" 时生效booleanfalse
showClear当值不为空时,trigger 是否展示清除按钮booleanfalse
showFilteredOnly搜索状态下是否只展示过滤后的结果booleanfalse
showLine选项面板中选项显示连接线。v2.50.0后提供booleanfalse
showRestTagsPopover当超过 maxTagCount,hover 到 +N 时,是否通过 Popover 显示剩余内容。v2.22.0后提供booleanfalse
showSearchClear是否显示搜索框的清除按钮booleantrue
size选择框大小,可选 largesmalldefaultstringdefault
style选择框的样式CSSProperties-
suffix后缀标签ReactNode-
treeDatatreeNodes 数据,如果设置则不需要手动构造 TreeNode 节点(key 值在整个树范围内唯一)TreeNodeData[][]
treeNodeFilterProp搜索时输入项过滤对应的 TreeNodeData 属性stringlabel
treeNodeLabelProp作为显示的 prop 设置stringlabel
triggerRender自定义触发器渲染方法(props: TriggerRenderProps) => ReactNode-
validateStatus校验结果,可选 warningerrordefault(只影响样式背景色)string-
value当前选中的节点的value值,传入该值时将作为受控组件
ValueType
-
virtualize列表虚拟化,用于大量树节点的情况,由 height, width, itemSize 组成,参考 Tree - Virtualize Object。开启后将关闭动画效果。object-
zIndextreeSelect下拉菜单的zIndexnumber1030
onBlur失去焦点时的回调Function(event)-
onChange选中树节点时调用此函数,默认返回值为当前所有选中项的value值及节点属性;如果是通过tag关闭,event参数为nullFunction-
onChangeWithObject是否将选中项 option 的其他属性作为回调。设为 true 时,onChange 的入参类型Function(node|node[], e) 此时如果是受控,也需要把 value 设置成 object,且必须含有 value 的键值;defaultValue同理。booleanfalse
onClear点击清除按钮时触发的回调。v2.52.0后提供(e: Event) => void-
onExpand展示节点时调用
(expandedKeys, object) => void
-
onFocus聚焦时的回调Function(event)-
onLoad节点加载完毕时触发的回调
(loadedKeys, treeNode) => void
-
onSearch文本框值变化时回调。
入参 filteredExpandedKeys 表示因为搜索或 value / defaultValue 而展开的节点的 key, 可以配合 expandedKeys 受控时使用。filteredExpandedKeys 在 2.6.0 中新增
入参 filteredNodes 是搜索命中的节点。filteredNodes 在 2.57.0 中新增
(input, filteredExpandedKeys, filteredNodes)=>void
onSelect被选中时调用,返回值为当前事件选项的key值
(selectedKey, selected, selectedNode)=>void
-
onVisibleChange弹出层展示/隐藏时触发的回调Function(isVisible:boolean)

TreeNodeData

不同 TreeNodeData 的 key 值要求必填且唯一。label 允许重复。value 值非必填。此时 onChange, value, defaultValue 及 onChangeWithObject 中所取的 value 属性值将改为 key 值。 为了保证行为的符合预期,treeData 中的 value 值或者全部不填写,或者全部填写且唯一,不建议混写。
属性说明类型默认值
value属性值string|number-
label展示的文本string|ReactNode-
icon自定义图标ReactNode-
disabled是否禁用,多选状态下支持booleanfalse
keyrequired且要求唯一string-
isLeaf是否为叶子节点boolean-

Methods

绑定在组件实例上的方法,可以通过 ref 调用实现某些特殊交互
NameDescription
search(sugInput: string)如果需要在外部自定义搜索框,可以在自定义搜索框值变更时主动调用该方法,改变筛选结果

Accessibility

ARIA

  • TreeSelect 会自动设置 aria-label 为 'TreeSelect',也支持用户自行设置 aria-label 来表示该 TreeSelect 作用;
  • TreeSelect 允许用户设置 aria-describedbyaria-errormessagearia-invalidaria-labelledbyaria-required,另外,Form 会为 Form.TreeSelect 自动设置这些属性;
  • TreeSelect 会自动为每个子节点分别设置 aria-disabledaria-checkedaria-selectedaria-level 来表明节点状态及层级;
示例:

设计变量