UI Design System
build dev

Transfer

在两个集合之间移动条目。中文惯用名:穿梭框。
稳定本期新增已接入

元信息

字段值
规范 IDcomponent.transfer
名称Transfer
二级分类数据录入(data-entry)
用途在两个集合之间移动条目
描述中文惯用名:穿梭框。

预览

静态结构:Transfer 根节点 data-slot="transfer",左右两个面板(data-slot 分别为 transfer-left-panel / transfer-right-panel)加中间竖排两个移动按钮(「移到右侧」「移到左侧」,无勾选时禁用)。每个面板:列头为全选 checkbox(仅作用于该列可用项)+ 标题 + 计数(「N 项」),列体为 checkbox 列表(禁用项半透明不可勾)。勾选后点移动按钮批量迁移并清空该侧勾选;disabled 的选项不参与移动。Form 内声明 name 时外层包 FieldShell(label + 校验错误)。

DSL 结构

DslNode
{
  "type": "Transfer",
  "props": {
    "name": "owners",
    "titles": [
      "候选成员",
      "已选成员"
    ],
    "options": [
      {
        "label": "陈晨",
        "value": "u-01"
      },
      {
        "label": "林晚",
        "value": "u-02"
      },
      {
        "label": "苏叶",
        "value": "u-03"
      },
      {
        "label": "周屿",
        "value": "u-04"
      }
    ]
  }
}

何时用

何时使用

  • 在两个集合之间移动条目:从候选集挑选成员、权限项、字段子集。
  • 候选数量较多且需要直观对照「已选 / 未选」两栏,批量勾选移动。

何时不用

  • 少量选项(十几个以内)的多选:使用 Checkbox 组或 Select 多选,Transfer 的双栏结构过重。
  • 需要排序已选集合:当前实现不含排序能力,仅维护目标侧集合。
  • 层级数据选择:使用 TreeSelect / Cascader。

变体

变体视觉形态适用场景
基础穿梭左右两栏 + 中间移动按钮,titles 缺省「列表 1 / 列表 2」通用候选 → 目标集合挑选
titles 自定义标题列头标题按业务命名语义化双栏(如「可选权限 / 已授权限」)
选项级 disabled单个选项半透明不可勾选、不参与移动必备项 / 无权限项锁定在某侧
disabled 整体禁用全部勾选与移动按钮禁用只读回显已选集合

API 属性

属性类型默认值说明
namestring—字段名;在 Form 内声明即自动成为表单项
labelstring—表单项标签(FieldShell 呈现)
rulesFieldRule[]—校验规则
optionsTransferOption[][]全部选项({ label, value, disabled? };左列 = 未进目标侧的项,右列 = 目标侧的项)
value`Array<stringnumber>`—
titles[string, string]['列表 1', '列表 2']左右两列标题
disabledbooleanfalse整体禁用(勾选与移动均不可用)
onChange`(value: Array<stringnumber>) => void`—
classNamestring—根节点 class(Form 内为 form-item 容器,独立渲染时为控件根节点)
styleCSSProperties—根节点内联样式(同 className 的挂载规则)

使用规范

  • 值与 onChange 只表达目标侧(右列)value 数组;左列由 options 减去目标侧推导,不要单独维护。
  • titles 按业务语义命名(如「候选成员 / 已选成员」),不要沿用缺省「列表 1 / 列表 2」上线。
  • 勾选是中间态,点移动按钮才提交 onChange;移动后该侧勾选自动清空。
  • 选项级 disabled 用于锁定必备项;整体 disabled 用于只读回显。
  • 候选少量时不要上 Transfer:双栏结构在十几个选项内反而降低效率,用 Checkbox 组。

正例

  • ✓ 权限配置:options 为全部权限点,titles ["未授权", "已授权"],批量勾选后点箭头移动。
  • ✓ 报表字段挑选:几十个字段中选展示列,Form 内 name + 至少选一项 rules。
  • ✓ 必备项锁定:核心字段选项 disabled,始终留在目标侧不可移出。

反例

  • ✕ 8 个选项的多选也上 Transfer(应使用 Checkbox 组)。
  • ✕ 用缺省标题「列表 1 / 列表 2」直接上线,用户不理解两栏语义。
  • ✕ 试图用 Transfer 对已选集合排序(实现不含排序能力)。

Design Token 映射

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