跳转到内容

树选择 TreeSelect

最简单的用法。

可以通过设置 treeCheckable 属性开启复选框勾选。

可以通过treeCheckStrategy属性定制回填方式。

选中值支持双向绑定。

自定义树选择下拉框的页头和页脚

使用 fallback-option 自定义找不到选项的值的显示效果,默认找不到选项就展示值本身。用户可以将其设定为 false 来隐藏那些没有匹配到节点数据的值。

通过 fieldNames 字段可以自定义 TreeData 的字段名。

labelInValuetrue 时,value 格式为: { label: string, value: string }

可以通过 loadMore 进行动态加载。此时可设置 isLeaf 来标示叶子节点。

多选

通过 popupVisible (支持 v-model) 控制下拉框的展开和收起。

监听 search 事件,在事件处理函数中获取数据并更新 treeData。 自定义搜索逻辑时,建议关闭内部过滤逻辑(:disable-filter="true"),以免影响自定义结果。

设置 :allow-search="true" 启用搜索功能。动态加载时候只能在已加载数据中进行搜索。默认的关键字搜索是从value字段匹配。也可以传入 filterTreeNode自定义过滤方式。

设置 size 可以使用四种尺寸(small, default, large, huge)的选择器。高度分别对应 24px、28px、32px、36px。

自定义触发元素。

当前示例会同时展示三种常见写法:直接传空对象使用默认固定高度、显式传 itemSize 固定模式、显式传 minItemSize 动态模式。这样可以直接验证 TreeSelect 现在已经支持顶层 virtual-list-props,而不需要再通过旧的内部透传路径开启虚拟列表。

通过指定 virtual-list-props 来开启虚拟列表,在大量数据时获得高性能表现。TreeSelect 内部树节点默认按尺寸走固定高度模式:mini / small / medium / large 分别对应 24 / 28 / 32 / 36。如果你没有显式传 itemSizeminItemSize,组件会按内部 Tree size 自动补齐固定高度;如果你需要动态树节点高度或虚拟模式下的展开动画,请显式改传 minItemSize。完整参数与迁移映射见 虚拟列表迁移指南

TreeSelect 在命名和大部分基础交互上和 Arco Design Vue 更接近,但实际实现已经切换到当前组件库内部的 TreeTriggerSelectView、表单与主题链路。迁移时通常可以先平移 API,再按需适配当前组件库的树节点插槽和弹层行为。

Arco Design VueSD Design Vue说明
a-tree-selectsd-tree-select树选择器主体
datadata树数据主属性保持一致
v-model / model-valuev-model / model-value受控写法保持一致
field-namesfield-names字段映射保持一致
multiplemultiple多选模式写法保持一致
tree-checkabletree-checkable复选框模式写法保持一致
tree-checked-strategytree-checked-strategy回填策略写法保持一致
load-moreload-more动态加载写法保持一致
popup-visiblepopup-visible弹层显隐控制保持一致
#label / #tag / #header / #footer同名插槽选择框与下拉层插槽基本可直接迁移
  1. 当前实现的树面板完全复用本地 Tree 组件,因此节点内容定制更偏向 Tree 子插槽写法,像标题和额外内容应优先使用 tree-slot-titletree-slot-extra,不要继续依赖旧版内部节点 DOM 结构。
  2. 弹层容器、局部主题和表单联动都走当前组件库内部链路。历史上如果通过外层容器 hack 修过滚动定位或局部主题,迁移后应优先改成 popup-containertrigger-propsConfigProvider
  3. 复选框模式、多选模式和路径展示的组合行为以当前组件库实现为准,特别是 tree-checkableshow-pathseparator 一起使用时,建议重新验收回填文本和删除标签行为。
  4. 树节点渲染的公开扩展方式统一收敛到插槽,没有额外对外暴露函数式 render API;自定义节点 UI 时优先走模板插槽。
<template>
<a-tree-select v-model="value" :data="treeData" placeholder="Please select ..." />
</template>
<template>
<sd-tree-select v-model="value" :data="treeData" placeholder="Please select ..." />
</template>
<template>
<a-tree-select v-model="value" :data="treeData" tree-checkable tree-checked-strategy="child" />
</template>
<template>
<sd-tree-select v-model="value" :data="treeData" tree-checkable tree-checked-strategy="child" />
</template>
<template>
<sd-tree-select v-model="value" :data="treeData">
<template #tree-slot-title="{ title }">
<strong>{{ title }}</strong>
</template>
</sd-tree-select>
</template>
  1. 先直接替换组件标签并保留原有 datafield-namesmultipletree-checkable 等写法,优先让页面恢复渲染。
  2. 再检查树节点定制:如果历史代码依赖旧版节点 DOM 或内部 class,改成 tree-slot-titletree-slot-extra 这类公开插槽。
  3. 接着回归弹层与主题:重点检查滚动容器、局部主题、表单校验、动态加载和复选框勾选链路。
  4. 最后确认组合行为:特别是 tree-checkabletree-check-strictlyshow-pathload-more 和远程搜索一起出现的复杂场景。

TreeSelect 这次迁移以当前组件库的 TreeTriggerSelectView 和表单体系为基础,同时保留了 Naive UI 常用 props 的兼容别名,目标是让旧业务可以先平滑替换,再逐步回到本地优先的 API 命名。

Naive UISD Design Vue说明
n-tree-selectsd-tree-select树选择器主体
:options:data / :options当前组件库主属性是 data,但保留 options 兼容别名
v-model:valuev-model / v-model:value两种受控写法都支持
filterableallow-search / filterable本地推荐使用 allow-search
clearableallow-clear / clearable本地推荐使用 allow-clear
checkabletree-checkable / checkable本地推荐使用 tree-checkable
check-strategytree-checked-strategy / checkStrategy本地推荐使用 tree-checked-strategy
show / default-showpopup-visible / default-popup-visible,同时兼容 show / defaultShow显隐控制可逐步迁回本地命名
render-tag#tag对外渲染函数已移除,统一改用插槽
节点标题自定义tree-slot-title树节点内容通过 Tree 子插槽定制
  1. 运行时行为以当前组件库为主,尤其是弹层挂载、局部主题、表单联动、树节点交互和滚动容器,已经统一接入本地 Trigger / Tree / ConfigProvider。迁移后不要继续依赖 Naive 的内部浮层层级或私有 DOM 结构。
  2. 当前版本保留了 optionsvalueshowfilterableclearablecheckablecheckStrategy 等兼容面,但新增代码建议直接使用本地命名:datamodel-valuepopup-visibleallow-searchallow-cleartree-checkabletree-checked-strategy
  3. 对外 render function 已经全部移除。原来依赖 render-tag、自定义节点渲染函数的场景,要分别改成 taglabeltree-slot-titletree-slot-extra 等插槽。
  4. tree-checkable 和多选展示已经接入当前组件库的本地勾选状态链路,勾选模式下的标签展示、回填策略和 show-path 都以当前实现为准。迁移含复选框的场景时,建议重点回归父子联动、严格模式和回填文本。
<template>
<n-tree-select
v-model:value="value"
:options="options"
filterable
clearable
placeholder="Please select ..."
/>
</template>
<template>
<sd-tree-select
v-model="value"
:data="options"
allow-search
allow-clear
placeholder="Please select ..."
/>
</template>
<template>
<n-tree-select v-model:value="value" :options="options" checkable :check-strategy="'child'" />
</template>
<template>
<sd-tree-select v-model="value" :data="options" tree-checkable tree-checked-strategy="child" />
</template>
<template>
<n-tree-select v-model:value="value" :options="options" multiple :render-tag="renderTag" />
</template>
<template>
<sd-tree-select v-model="value" :data="options" multiple>
<template #tag="{ data }">
<span>{{ data?.title ?? data?.label }}</span>
</template>
</sd-tree-select>
</template>
<template>
<sd-tree-select v-model="value" :data="options">
<template #tree-slot-title="{ title }">
<strong>{{ title }}</strong>
</template>
</sd-tree-select>
</template>
  1. 先替换组件本体并让页面跑起来:n-tree-select 改成 sd-tree-select,原有 optionsvaluefilterableclearablecheckable 可以先靠兼容别名维持行为。
  2. 再统一属性命名:把 options 迁到 data,把 filterable / clearable / checkable / check-strategy 逐步改成 allow-search / allow-clear / tree-checkable / tree-checked-strategy,避免新旧命名长期混用。
  3. 接着迁移自定义渲染:删除 render-tag 等函数式入口,改用 labeltagtree-slot-titletree-slot-extra 等模板插槽。
  4. 最后逐项验收交互:重点检查勾选模式、tree-check-strictlyshow-path、远程搜索、虚拟列表、回退选项和弹层显隐控制,确认它们已经符合当前组件库的本地行为。
参数名描述类型默认值版本
disabled是否禁用booleanfalse
loading是否为加载中状态booleanfalse
error是否为错误状态booleanfalse
size选择框的大小'mini' | 'small' | 'medium' | 'large''medium'
border是否显示边框booleantrue
allow-search是否允许搜索,兼容 filterable 别名boolean | { retainInputValue?: boolean }false (single) | true (multiple)
filterableallow-search 的兼容别名boolean-
allow-clear是否允许清除,兼容 clearable 别名booleanfalse
clearableallow-clear 的兼容别名boolean-
placeholder提示文案string-
max-tag-count最多显示的标签数量,仅在多选模式有效,支持响应式折叠number | 'responsive'-
multiple是否支持多选booleanfalse
default-value默认值string | number | Array<string | number> | LabelValue | LabelValue[]-
model-value (v-model)绑定值string | number | Array<string | number> | LabelValue | LabelValue[]-
value (v-model:value)model-value 的兼容别名string | number | Array<string | number> | LabelValue | LabelValue[]-
field-names指定节点数据中的字段名TreeFieldNames-
data数据,兼容 options 别名TreeNodeData[][]
optionsdata 的兼容别名TreeNodeData[]-
label-in-value设置value格式。默认是string,设置为true时候,value格式为: { label: string, value: string }booleanfalse
tree-checkable是否展示复选框,兼容 checkable 别名booleanfalse
checkabletree-checkable 的兼容别名boolean-
tree-check-strictly父子节点是否关联booleanfalse
tree-checked-strategy定制回显方式,兼容 checkStrategy 别名'all' | 'parent' | 'child''all'
checkStrategytree-checked-strategy 的兼容别名'all' | 'parent' | 'child'-
show-path单选时展示从根节点到当前节点的完整路径booleanfalse
separatorshow-path 开启时的路径分隔符string' / '
tree-props可以接受所有 Tree 组件的PropsPartial<TreeProps>-
trigger-props可以接受所有 Trigger 组件的PropsPartial<TriggerProps>-
virtual-scrollNaive 兼容开关。设为 false 时会关闭通过 virtual-list-propstreeProps.virtualListProps 注入的虚拟列表配置boolean-
popup-visible (v-model)弹出框是否可见boolean-
default-popup-visible默认弹出框是否可见booleanfalse
dropdown-style下拉框样式CSSProperties-
dropdown-class-name下拉框样式 classstring | string[]-
filter-tree-node自定义节点过滤函数(searchKey: string, nodeData: TreeNodeData) => boolean-
load-more动态加载数据(nodeData: TreeNodeData) => Promise<void>-
disable-filter禁用内部过滤逻辑booleanfalse
popup-container弹出框的挂载容器string | HTMLElement-
fallback-option为 value 中找不到匹配项的 key 定义节点数据boolean | ((key: number | string) => TreeNodeData | boolean)true2.22.0
selectable设置可选择的节点,默认全部可选boolean| 'leaf'| (( node: TreeNodeData, info: { isLeaf: boolean; level: number } ) => boolean)true2.27.0
scrollbar是否开启虚拟滚动条boolean | ScrollbarPropstrue2.39.0
show-header-on-empty空状态时是否显示headerbooleanfalse
show-footer-on-empty空状态时是否显示footerbooleanfalse
input-value (v-model)输入框的值string-2.55.0
default-input-value输入框的默认值(非受控模式)string''2.55.0
事件名描述参数版本
change值改变时触发value: string | number | LabelValue | Array<string | number> | LabelValue[] | undefined
popup-visible-change下拉框显示状态改变时触发visible: boolean
search搜索值变化时触发searchKey: string
clear点击清除时触发-
input-value-change输入框的值发生改变时触发inputValue: string2.55.0
插槽名描述参数版本
trigger自定义触发元素-
prefix前缀-
label自定义选择框显示data: mixed
tag自定义多选标签显示data: TreeNodeData
header自定义下拉框页头-
loader定制加载中显示的内容-
empty定制空数据展示-
footer自定义下拉框页脚-
tree-slot-extra定制 tree 组件的渲染额外节点内容-
tree-slot-title定制 tree 组件的节点标题title: string
tree-slot-icon定制 tree 组件的节点图标node: TreeNodeData2.18.0
tree-slot-switcher-icon定制 tree 组件的 switcher 图标-