TreeSelect

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

设计文档(新窗口打开)

代码演示

如何引入

import { TreeSelect } from '@chenzy-design/svelte';

基本用法

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

多选

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



限制标签展示数量

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

maxTagCount=2:
maxTagCount=2, showRestTagsPopover:

可搜索的

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

showFilteredOnly






远程搜索

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

搜索框位置

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



Trigger 内多行换行(triggerTagWrap)

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

尺寸大小

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





默认展开

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

在下面的 demo 中,treeData 更新后,defaultExpandAll 失效,expandAll 仍然生效。

禁用





严格禁用

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

受控

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

节点选中关系

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

开启搜索的展开受控

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

虚拟化

列表虚拟化,用于大量树节点的情况。开启后,动画效果将被关闭。virtualize 是一个包含 height、width、itemSize 的对象。如果带搜索框,建议开启 showFilteredOnly 减少多余节点的渲染。

共 0 个节点

动态更新数据



异步加载数据

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

自定义 Trigger

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

triggerRender 入参如下:

interface TriggerRenderProps {
  componentProps: Partial<Record<keyof Props, unknown>>; // 所有用户传给 TreeSelect 的 props
  disabled: boolean; // 是否禁用 TreeSelect
  value: TreeNode[]; // 已选中的 node 数组
  inputValue: string; // 当前 input 框的输入值
  onClear: (e: MouseEvent) => void; // 用于清空值的函数
  placeholder: string; // placeholder
  onRemove: (key: TreeKey) => void; // 删除单个 item 时调用的函数,以 item 的 key 作为入参
  onSearch: (inputValue: string) => void; // 用于在 Input 框值更新时启动搜索;当你在 triggerRender 自定义的 Input 组件值更新时,应调用该函数以向 TreeSelect 内部同步状态,使用时需设置 filterTreeNode 非 false、searchPosition 为 'trigger'
  isOpen: boolean; // 面板是否展开(本库额外新增字段,Semi 无此字段)
}

自定义渲染已选项

你可以通过 renderSelectedItem 自定义选择框中已选项标签的渲染结构。

  • 单选、多选统一签名:renderSelectedItem({ node: TreeNode; onRemove: () => void })
  • 单选时忽略 onRemove,直接渲染任意内容替换整个已选展示
  • 多选时每个已选节点独立渲染一次;onRemove 用于移除该节点(对齐 Semi 的 onClose)
  • 对齐 Semi renderSelectedItem 的 { isRenderInTag, content } 双返回协议:Semi 用返回值告知框架是否需要外层包一层 Tag(isRenderInTag=true 自动包裹带背景色和关闭按钮的 Tag,isRenderInTag=false 直接渲染返回的 content);Svelte Snippet 直接接管渲染,不存在框架二次包裹——想要 Tag 外壳就在 Snippet 内自己渲染 <Tag>,不想要则渲染任意内容,表达能力等价
单选
多选 + isRenderInTag=true
多选 + isRenderInTag=false

命令式搜索

如果需要在外部自定义搜索框,可以通过 bind:this 拿到组件实例后,在自定义搜索框值变更时主动调用 search 方法,改变筛选结果。

API 参考

TreeSelect

属性说明类型默认值
aria-label无障碍标签string-
ariaDescribedbyaria-describedby:关联 helpText / extraTextstring-
ariaErrormessagearia-errormessage:error 态关联错误信息容器string-
ariaLabelledbyaria-labelledby:关联外部 label 元素string-
ariaRequiredaria-required:必填语义boolean-
arrowIcon自定义右侧下拉箭头 IconSnippet-
autoAdjustOverflow浮层被遮挡时是否自动调整方向booleantrue
autoExpandParent是否自动展开父节点booleanfalse
autoMergeValue开启后,当某个父节点被选中时,value 将不包括该节点的子孙节点(在 leafOnly 为 false 时生效)booleantrue
borderless无边框模式booleanfalse
checkRelation多选时,节点之间选中状态的关系,可选:related、unRelatedstringrelated
class选择框的 className 属性string-
clearIcon可用于自定义清除按钮,showClear 为 true 时有效Snippet-
clickToHide选择后是否自动关闭下拉弹层,仅单选模式有效booleantrue
clickTriggerToHide面板打开状态下,点击 Trigger 后是否关闭面板booleantrue
defaultExpandAll设置在初始化时是否展开所有节点booleanfalse
defaultExpandedKeys默认展开的节点,显示其直接子级string[]-
defaultOpen默认展开下拉菜单booleanfalse
defaultValue指定默认选中的条目string \| number \| array-
disabled是否禁用booleanfalse
disableStrictly是否严格禁用booleanfalse
dropdownClassName下拉菜单的 className 属性string-
dropdownMargin下拉菜单计算溢出时增加的冗余值,作用同 Tooltip marginobject \| number-
dropdownMatchSelectWidth下拉菜单最小宽度是否等于 Selectbooleantrue
dropdownStyle下拉菜单的样式string \| Record<string, string>-
emptyContent当搜索无结果时展示的内容string \| Snippet暂无数据
expandAction展开逻辑,可选 false、'click'、'doubleClick',默认仅点击展开按钮才会展开boolean \| stringfalse
expandAll设置是否默认展开所有节点,若后续数据发生改变,展开情况也会受此 api 影响booleanfalse
expandedKeys(受控)展开的节点,默认展开节点显示其直接子级string[]-
expandIcon自定义展开图标Snippet-
keyMaps自定义节点中 key、label、value 的字段object-
filterTreeNode是否根据输入项进行筛选,默认用 treeNodeFilterProp 的值筛选boolean \| ((input, treeNodeString, data) => boolean)false
remote是否启用远程搜索,开启后输入时跳过本地过滤,仅触发 onSearch 回调booleanfalse
getPopupContainer指定父级 DOM,弹层将会渲染至该 DOM 中,自定义需要设置 position: relative() => HTMLElement-
insetLabel触发器内嵌标签,渲染在回填值/占位符之前string \| Snippet-
insetLabelId内嵌标签的 id(a11y 关联用)string-
labelEllipsis是否开启 label 的超出省略,默认虚拟化状态下开启booleanfalse
leafOnly多选模式下 onChange 回调入参及展示标签只有叶子节点booleanfalse
loadData异步加载数据,需要返回一个 Promise(node) => Promise<node[]>-
loadedKeys(受控)已经加载的节点,配合 loadData 使用Set<string>-
maxTagCount最多显示多少个 tagnumber-
motion下拉浮层进出场动画booleantrue
motionExpand是否开启选项树节点动画booleantrue
multiple是否支持多选booleanfalse
optionListStyleoptionList 的样式string \| Record<string, string>-
outerBottomSlot渲染在弹出层底部,与 optionList 平级的自定义 slotSnippet-
outerTopSlot渲染在弹出层顶部,与 optionList 平级的自定义 slotSnippet-
placeholder选择框默认文字string-
position下拉菜单位置,可选值参考 Tooltip positionstringbottomLeft
prefix前缀标签string \| Snippet-
preventScroll指示浏览器是否应滚动文档以显示新聚焦的元素,作用于组件内的 focus 方法boolean-
renderFullLabel完全自定义 label 的渲染函数Snippet-
renderLabel自定义 label 的渲染函数Snippet-
renderSelectedItem自定义渲染已选项Snippet<[{ node, onRemove }]>-
restTagsPopoverPropsPopover 的配置属性object{}
searchAutoFocus搜索框自动聚焦booleanfalse
searchPlaceholder搜索框默认文字string-
searchPosition设置搜索框的位置,可选:dropdown、triggerstringdropdown
triggerTagWrap是否允许在 trigger 内将多选标签换行展示(仅多选 + filterTreeNode + searchPosition=“trigger” 时生效)booleanfalse
showClear当值不为空时,trigger 是否展示清除按钮booleanfalse
showFilteredOnly搜索状态下是否只展示过滤后的结果booleanfalse
showLine选项面板中选项显示连接线booleanfalse
showRestTagsPopover当超过 maxTagCount,hover +N 时,是否通过 Popover 显示剩余内容booleanfalse
showSearchClear是否显示搜索框的清除按钮booleantrue
size选择框大小,可选 large、small、defaultstringdefault
stopPropagation触发器点击是否阻止事件冒泡booleantrue
style选择框的样式string-
suffix后缀标签string \| Snippet-
treeDatatreeNodes 数据,key 值在整个树范围内唯一TreeNodeData[][]
treeNodeFilterProp搜索时输入项过滤对应的 TreeNodeData 属性stringlabel
treeNodeLabelProp作为显示的 prop 设置stringlabel
triggerRender自定义触发器渲染方法Snippet-
validateStatus校验结果,可选 warning、error、default(只影响样式背景色)string-
value当前选中的节点的 value 值,传入时作为受控组件string \| number \| array-
virtualize列表虚拟化,由 height、width、itemSize 组成,开启后将关闭动画效果object-
zIndextreeSelect 下拉菜单的 zIndexnumber1030
onBlur失去焦点时的回调(e) => void-
onChange选中树节点时调用,默认返回当前所有选中项的 value 值及节点属性Function-
onChangeWithObject是否将选中项 option 的其他属性作为回调booleanfalse
onClear点击清除按钮时触发的回调(e) => void-
onExpand展示节点时调用(expandedKeys, object) => void-
onFocus聚焦时的回调(e) => void-
onLoad节点加载完毕时触发的回调(loadedKeys, treeNode) => void-
onSearch文本框值变化时回调(input, filteredExpandedKeys, filteredNodes) => void-
onSelect被选中时调用,返回值为当前事件选项的 key 值(selectedKey, selected, selectedNode) => void-
onVisibleChange弹出层展示/隐藏时触发的回调(isVisible: boolean) => void-

TreeNodeData

不同 TreeNodeData 的 key 值要求必填且唯一。label 允许重复。value 值非必填,此时 onChange、value、defaultValue 中所取的 value 属性值将改为 key 值。

属性说明类型默认值
value属性值string \| number-
label展示的文本string \| Snippet-
icon自定义图标Snippet-
disabled是否禁用,多选状态下支持booleanfalse
keyrequired 且要求唯一string-
isLeaf是否为叶子节点boolean-

Methods

绑定在组件实例上的方法,可以通过 bind:this 拿到实例后调用:

名称描述
search(input)如果需要在外部自定义搜索框,可以在自定义搜索框值变更时主动调用该方法,改变筛选结果

Accessibility

ARIA

  • TreeSelect 会自动设置 aria-label 为 TreeSelect,也支持用户自行设置 aria-label 来表示该 TreeSelect 作用。
  • TreeSelect 允许用户设置 aria-describedby、aria-errormessage、aria-invalid、aria-labelledby、aria-required。
  • TreeSelect 会自动为每个子节点分别设置 aria-disabled、aria-checked、aria-selected、aria-level 来表明节点状态及层级。

设计变量

变量
默认值
用法
--cd-color-tree-option-bg-active var(--cd-color-primary-light-default) 树选项选中/激活背景($color-tree_option-bg-active)
--cd-color-tree-option-bg-hover var(--cd-color-fill-0) 树选项悬停背景($color-tree_option-bg-hover)
--cd-color-tree-option-disabled-text-default var(--cd-color-disabled-text) 禁用树选项文字颜色($color-tree_option_disabled-text-default)
--cd-color-tree-option-draggable-insert-border-default var(--cd-color-primary) 可拖拽插入指示线颜色($color-tree_option_draggable_insert-border-default)
--cd-color-tree-option-highlight-text var(--cd-color-primary) 搜索命中高亮文本色($color-tree_option_hightlight-text)
--cd-color-tree-option-icon-active var(--cd-color-black) 展开图标按下色($color-tree_option-icon-active)
--cd-color-tree-option-icon-default var(--cd-color-text-2) 展开箭头 / 节点图标颜色($color-tree_option-icon-default)
--cd-color-tree-option-icon-hover var(--cd-color-text-0) 展开图标悬停色($color-tree_option-icon-hover)
--cd-color-tree-option-line var(--cd-color-text-3) showLine 连接线颜色(Semi 用 --semi-color-text-3)
--cd-color-tree-option-loading-icon-default var(--cd-color-primary) 树选项加载 spin 颜色($color-tree_option_loading-icon-default)
显示第 1 条-第 10 条,共 35 条
  • 1
  • 2
  • 3
  • 4