UI Design System
build dev

TreeSelect

从层级候选项中选择。中文惯用名:树选择器。
稳定本期新增已接入

元信息

字段值
规范 IDcomponent.tree-select
名称TreeSelect
二级分类数据录入(data-entry)
用途从层级候选项中选择
描述中文惯用名:树选择器。

预览

静态结构:TreeSelect 为 input 风格触发器(data-slot="treeselect-trigger",显示选中节点 label,缺省「请选择」)+ 受控 Popover 弹层;searchable 时弹层顶部为过滤输入(按 label 过滤,命中节点的祖先保留展开),下方为 data-slot="treeselect-tree" 内联树(自实现):每个节点 data-slot="treeselect-node",含子节点的节点前置 ChevronRight 展开 / 收起按钮(展开时旋转 90°),按深度缩进,选中节点高亮;打开弹层时自动展开到当前选中节点。单选,选中即关闭弹层。Form 内声明 name 时外层包 FieldShell(label + 校验错误)。

DSL 结构

DslNode
{
  "type": "TreeSelect",
  "props": {
    "name": "department",
    "placeholder": "请选择部门",
    "options": [
      {
        "label": "华东大区",
        "value": "east",
        "children": [
          {
            "label": "杭州分公司",
            "value": "hz"
          },
          {
            "label": "上海分公司",
            "value": "sh"
          }
        ]
      },
      {
        "label": "华南大区",
        "value": "south"
      }
    ]
  }
}

何时用

何时使用

  • 从层级候选项中选择单个节点:组织架构、分类树、目录归属。
  • 树节点均可选(父节点也是合法值),且需要展开 / 收起浏览或按 label 搜索。

何时不用

  • 只有叶子才是合法值、强调逐级下钻:使用 Cascader(值是路径数组)。
  • 扁平候选列表:使用 Select,不必引入树结构。
  • 需要多选:当前实现为单选,多选用 Checkbox 组或其他多选组件。

变体

变体视觉形态适用场景
基础树选择弹层内联树,可展开 / 收起逐级浏览层级不深、节点可浏览的场景
searchable 搜索弹层顶部过滤输入,按 label 过滤并保留祖先展开树较大、需要快速定位节点
placeholder 空态未选时触发器显示弱提示(缺省「请选择」)非必填层级字段
disabled 禁用触发器半透明不可点开联动未就绪或只读场景

API 属性

属性类型默认值说明
namestring—字段名;在 Form 内声明即自动成为表单项
labelstring—表单项标签(FieldShell 呈现)
rulesFieldRule[]—校验规则
optionsTreeSelectOption[][]嵌套选项树({ label, value, children? })
value`stringnumber`—
placeholderstring'请选择'空态提示文案
searchablebooleanfalse弹层顶部显示过滤输入(按 label 过滤,命中节点的祖先保留展开)
disabledbooleanfalse禁用触发器
onChange`(value: stringnumber) => void`—
classNamestring—根节点 class(Form 内为 form-item 容器,独立渲染时为触发器)
styleCSSProperties—根节点内联样式(同 className 的挂载规则)

使用规范

  • 与 Cascader 的边界:TreeSelect 值是单个节点 value(父节点可选),Cascader 值是路径数组且叶子才完成选择;按数据语义选型。
  • 树超过两级或节点较多时开 searchable,让用户按 label 过滤而非逐级翻找。
  • options 的 value 在整棵树内必须唯一,否则选中回显会命中第一个匹配节点。
  • 父节点是否可选取决于业务:实现上任意节点点击即选中并关闭弹层,不要假设父节点仅用于展开。
  • 打开弹层自动展开到当前选中节点;value 必须能在 options 中找到,否则触发器回退空态。

正例

  • ✓ 部门归属:options 为组织架构树,选中任意层级部门,Form 内 name + 必填 rules。
  • ✓ 分类选择:searchable 开启,输入关键字过滤命中节点及其祖先。
  • ✓ 回显编辑:value 传入已存节点 value,打开弹层自动展开到该节点。

反例

  • ✕ 用 TreeSelect 做省市区选择且只存叶子(应使用 Cascader,保留完整路径)。
  • ✕ 树内 value 重复,回显命中错误节点。
  • ✕ 扁平十几个选项也套树结构(应使用 Select,减少层级负担)。

Design Token 映射

不适用:组件 tokenRefs 为空:样式 Token 数据尚未接入,三层映射(Primitive → Semantic → Component)待样式 Token 接入后回填。