Back to Ant Design

TreeSelect

components/tree-select/index.zh-CN.md

6.3.712.2 KB
Original Source

何时使用 {#when-to-use}

类似 Select 的选择控件,可选择的数据结构是一个树形结构时,可以使用 TreeSelect,例如公司层级、学科系统、分类目录等等。

代码演示 {#examples}

<!-- prettier-ignore -->

<code src="./demo/basic.tsx">基本</code> <code src="./demo/multiple.tsx">多选</code> <code src="./demo/treeData.tsx">从数据直接生成</code> <code src="./demo/checkable.tsx">可勾选</code> <code src="./demo/async.tsx">异步加载</code> <code src="./demo/treeLine.tsx">线性样式</code> <code src="./demo/placement.tsx">弹出位置</code> <code src="./demo/variant.tsx" version="5.13.0">形态变体</code> <code src="./demo/status.tsx">自定义状态</code> <code src="./demo/maxCount.tsx" version="5.23.0">最大选中数量</code> <code src="./demo/suffix.tsx" version="5.22.0">前后缀</code> <code src="./demo/style-class.tsx" version="6.0.0">自定义语义结构的样式和类</code> <code src="./demo/render-panel.tsx" debug>_InternalPanelDoNotUseOrYouWillBeFired</code> <code src="./demo/component-token.tsx" debug>组件 Token</code>

API

通用属性参考:通用属性

Tree props

参数说明类型默认值版本
allowClear自定义清除按钮boolean | { clearIcon?: ReactNode }false5.8.0: 支持对象形式
autoClearSearchValue当多选模式下值被选择,自动清空搜索框booleantrue
bordered是否带边框,请使用 variant 替代booleantrue-
classNames用于自定义组件内部各语义化结构的 class,支持对象或函数Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string>-
defaultOpen是否默认展开下拉菜单boolean-
defaultValue指定默认选中的条目string | string[]-
disabled是否禁用booleanfalse
dropdownClassName下拉菜单的 className 属性,请使用 classNames.popup.root 替代string--
dropdownMatchSelectWidth下拉菜单和选择器是否同宽,请使用 popupMatchSelectWidth 替代boolean | numbertrue-
popupClassName下拉菜单的 className 属性,使用 classNames.popup.root 替换string-4.23.0
popupMatchSelectWidth下拉菜单和选择器同宽。默认将设置 min-width,当值小于选择框宽度时会被忽略。false 时会关闭虚拟滚动boolean | numbertrue5.5.0
dropdownRender自定义下拉框内容,使用 popupRender 替换(originNode: ReactNode, props) => ReactNode-
popupRender自定义下拉框内容(originNode: ReactNode, props) => ReactNode-
dropdownStyle下拉菜单的样式,使用 styles.popup.root 替换object-
fieldNames自定义节点 label、value、children 的字段object{ label: label, value: value, children: children }4.17.0
filterTreeNode是否根据输入项进行筛选,默认用 treeNodeFilterProp 的值作为要筛选的 TreeNode 的属性值boolean | function(inputValue: string, treeNode: TreeNode) (函数需要返回 bool 值)function
getPopupContainer菜单渲染父节点。默认渲染到 body 上,如果你遇到菜单滚动定位问题,试试修改为滚动的区域,并相对其定位。示例function(triggerNode)() => document.body
labelInValue是否把每个选项的 label 包装到 value 中,会把 value 类型从 string 变为 {value: string, label: ReactNode, halfChecked: boolean(选项列表是否为半选状态,并且不会展示到值中) } 的格式booleanfalse
listHeight设置弹窗滚动高度number256
loadData异步加载数据。在过滤时不会调用以防止网络堵塞,可参考 FAQ 获得更多内容function(node)-
maxCount指定可选中的最多 items 数量,仅在 multiple=true 时生效。如果此时 (showCheckedStrategy = 'SHOW_ALL' 且未开启 treeCheckStrictly),或使用 showCheckedStrategy = 'SHOW_PARENT',则maxCount无效。number-5.23.0
maxTagCount最多显示多少个 tag,响应式模式会对性能产生损耗number | responsive-responsive: 4.10
maxTagPlaceholder隐藏 tag 时显示的内容ReactNode | function(omittedValues)-
maxTagTextLength最大显示的 tag 文本长度number-
multiple支持多选(当设置 treeCheckable 时自动变为 true)booleanfalse
notFoundContent当下拉列表为空时显示的内容ReactNodeNot Found
open是否展开下拉菜单boolean-
placeholder选择框默认文字string-
placement选择框弹出的位置bottomLeft bottomRight topLeft topRightbottomLeft
prefix自定义前缀ReactNode-5.22.0
searchValue搜索框的值,可以通过 onSearch 获取用户输入string-
showArrow是否显示箭头图标,请使用 suffixIcon={null} 替代booleantrue-
showCheckedStrategy配置 treeCheckable 时,定义选中项回填的方式。TreeSelect.SHOW_ALL: 显示所有选中节点(包括父节点)。TreeSelect.SHOW_PARENT: 只显示父节点(当父节点下所有子节点都选中时)。 默认只显示子节点TreeSelect.SHOW_ALL | TreeSelect.SHOW_PARENT | TreeSelect.SHOW_CHILDTreeSelect.SHOW_CHILD
showSearch是否支持搜索框boolean | Object单选:false | 多选:true
size选择框大小large | medium | small-
status设置校验状态'error' | 'warning'-4.19.0
suffixIcon自定义的选择框后缀图标ReactNode<DownOutlined />
switcherIcon自定义树节点的展开/折叠图标ReactNode | ((props: AntTreeNodeProps) => ReactNode)-renderProps: 4.20.0
styles用于自定义组件内部各语义化结构的行内 style,支持对象或函数Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties>-
tagRender自定义 tag 内容,多选时生效(props) => ReactNode-
treeCheckable显示 Checkboxbooleanfalse
treeCheckStrictlycheckable 状态下节点选择完全受控(父子节点选中状态不再关联),会使得 labelInValue 强制为 truebooleanfalse
treeDatatreeNodes 数据,如果设置则不需要手动构造 TreeNode 节点(value 在整个树范围内唯一)array<{value, title, children, [disabled, disableCheckbox, selectable, checkable]}>[]
treeDataSimpleMode使用简单格式的 treeData,具体设置参考可设置的类型 (此时 treeData 应变为这样的数据结构: [{id:1, pId:0, value:'1', title:"test1",...},...], pId 是父节点的 id)boolean | object<{ id: string, pId: string, rootPId: string }>false
treeTitleRender自定义渲染节点(nodeData) => ReactNode-5.12.0
treeDefaultExpandAll默认展开所有树节点booleanfalse
treeDefaultExpandedKeys默认展开的树节点string[]-
treeExpandAction点击节点 title 时的展开逻辑,可选:false | click | doubleClickstring | booleanfalse4.21.0
treeExpandedKeys设置展开的树节点string[]-
treeIcon是否展示 TreeNode title 前的图标,没有默认样式,如设置为 true,需要自行定义图标相关样式booleanfalse
treeLine是否展示线条样式,请参考 Tree - showLineboolean | objectfalse4.17.0
treeLoadedKeys(受控)已经加载的节点,需要配合 loadData 使用string[][]
treeNodeFilterProp输入项过滤对应的 treeNode 属性stringvalue
treeNodeLabelProp作为显示的 prop 设置stringtitle
value指定当前选中的条目string | string[]-
variant形态变体outlined | borderless | filled | underlinedoutlined5.13.0 | underlined: 5.24.0
virtual设置 false 时关闭虚拟滚动booleantrue4.1.0
onChange选中树节点时调用此函数function(value, label, extra)-
onDropdownVisibleChange展开下拉菜单的回调,使用 onOpenChange 替换(open: boolean) => void-
onOpenChange展开下拉菜单的回调(open: boolean) => void-
onSearch文本框值变化时的回调function(value: string)-
onSelect被选中时调用function(value, node, extra)-
onTreeExpand展示节点时调用function(expandedKeys)-
onPopupScroll下拉列表滚动时的回调(event: UIEvent) => void-5.17.0

showSearch

参数说明类型默认值版本
autoClearSearchValue当多选模式下值被选择,自动清空搜索框booleantrue
filterTreeNode是否根据输入项进行筛选,默认用 treeNodeFilterProp 的值作为要筛选的 TreeNode 的属性值boolean | function(inputValue: string, treeNode: TreeNode) (函数需要返回 bool 值)function
searchValue搜索框的值,可以通过 onSearch 获取用户输入string-
treeNodeFilterProp输入项过滤对应的 treeNode 属性stringvalue
onSearch文本框值变化时的回调function(value: string)-

Tree 方法

名称描述版本
blur()移除焦点
focus()获取焦点

TreeNode props

建议使用 treeData 来代替 TreeNode,免去手动构造的麻烦

参数说明类型默认值版本
checkable当树为 Checkbox 时,设置独立节点是否展示 Checkboxboolean-
disableCheckbox禁掉 Checkboxbooleanfalse
disabled是否禁用booleanfalse
isLeaf是否是叶子节点booleanfalse
key此项必须设置(其值在整个树范围内唯一)string-
selectable是否可选booleantrue
title树节点显示的内容ReactNode---
value默认根据此属性值进行筛选(其值在整个树范围内唯一)string-

Semantic DOM

<code src="./demo/_semantic.tsx" simplify="true"></code>

主题变量(Design Token){#design-token}

<ComponentTokenTable component="TreeSelect"></ComponentTokenTable>

FAQ

onChange 时如何获得父节点信息? {#faq-parent-node-info}

从性能角度考虑,我们默认不透出父节点信息。你可以这样获得:https://codesandbox.io/s/get-parent-node-in-onchange-eb1608

自定义 Option 样式导致滚动异常怎么办? {#faq-custom-option-scroll}

请参考 Select 的 FAQ

为何在搜索时 loadData 不会触发展开? {#faq-load-data-expand}

在 v4 alpha 版本中,默认在搜索时亦会进行搜索。但是经反馈,在输入时会快速阻塞网络。因而改为搜索不触发 loadData。但是你仍然可以通过 filterTreeNode 处理异步加载逻辑:

tsx
<TreeSelect
  filterTreeNode={(input, treeNode) => {
    const match = YOUR_LOGIC_HERE;

    if (match && !treeNode.isLeaf && !treeNode.children) {
      // Do some loading logic
    }

    return match;
  }}
/>

为何弹出框不能横向滚动? {#faq-popup-not-scroll}

关闭虚拟滚动即可,因为开启虚拟滚动时无法准确的测量完整列表的 scrollWidth