UI Design System
build dev

Switch

即时切换二元状态。中文惯用名:开关。
稳定本期新增已接入

元信息

字段值
规范 IDcomponent.switch
名称Switch
二级分类数据录入(data-entry)
用途即时切换二元状态
描述中文惯用名:开关。

预览

静态结构:Switch 为 inline-flex 包裹:开关轨道(data-slot="switch" + data-slot="switch-thumb" 滑块,切换时滑块平移)+ 旁侧 label 文本,label 经 htmlFor 关联控件 useId,点击文字即切换。Form 内声明非空 name 时外层为 data-slot="form-item" 容器(mb-4),label 与开关同行、不另起表单标签行,校验错误以 data-slot="form-error" 追加在下方。

DSL 结构

DslNode
{
  "type": "Switch",
  "props": {
    "name": "autoSave",
    "label": "开启自动保存",
    "value": true
  }
}

何时用

何时使用

  • 即时启停某项能力或状态:自动保存、消息推送、灰度开关。
  • 切换后立即生效、无需二次确认、不需提交按钮的布尔设置。
  • 表单内的 boolean 字段:声明 name 即自动注册,值为 true / false。

何时不用

  • 需要用户填写完表单再一起提交的布尔项(如「同意条款」):使用 Checkbox——多选 Checkbox、单选 RadioGroup、即时启停 Switch。
  • 互斥的多个选项中选一个:使用 RadioGroup。
  • 破坏性或高影响操作的确认(删除、下线):使用 Dialog / Popconfirm,不要用 Switch 一键切换。

变体

变体视觉形态适用场景
默认(开 / 关)轨道 + 滑块,开启态滑块移至右侧并高亮即时启停的设置项
无 label 纯开关仅开关本体(label 缺省不渲染)与外部说明文案配合的紧凑场景
Form 表单项form-item 容器:开关 + 标签同行,错误行在下方表单内 boolean 字段(声明 name 自动注册)
disabled 禁用半透明不可切换权限不足或依赖项未就绪

API 属性

属性类型默认值说明
namestring—字段名;在 Form 内声明即自动成为表单项(值为 boolean)
labelstring—开关旁的标签文本(Form 内仍与开关同行,不另起表单标签行)
rulesFieldRule[]—校验规则
valueboolean—受控值(独立渲染时生效,仅 true 视为开启);Form 内作为字段初始值(优先于 Form initialValues)
disabledbooleanfalse禁用切换
onChange(checked: boolean) => void—开关变化事件,传出 boolean(Renderer 绑定 events.onChange;DSL 语义值)
className / stylestring / CSSProperties—通用:根节点 class 合并 / 内联样式(Form 内为 form-item 容器,独立渲染时为控件包裹)

使用规范

  • 只用 true / false 两态,且切换立即生效:Three-state(未设置)场景请用 RadioGroup 或 Select 显式表达。
  • 高影响开关需给出后果说明与撤销路径(如「开启后所有成员可见」),必要时先经 Dialog 确认。
  • 依赖未就绪时用 disabled 而非隐藏,并说明原因,避免用户反复寻找入口。
  • 标签文案用肯定句式并描述开启后的状态(「开启自动保存」),不要用含义模糊的「模式」。
  • Form 内声明非空 name 才注册字段;未声明 name 时为独立受控控件,值不进表单 values。

正例

  • ✓ 设置页「自动保存」:onChange 立即写回接口,切换即生效,无需保存按钮。
  • ✓ Form 内布尔项:name + value 初始值,提交时随表单 values 一并带出。
  • ✓ 依赖未就绪:disabled + 旁注「需先选择数据源」,用户理解为何点不动。

反例

  • ✕ 用 Switch 承载「同意用户协议」这类需随表单提交的布尔项(应使用 Checkbox)。
  • ✕ 用 Switch 一键删除 / 下线资源,无确认也无撤销路径。
  • ✕ 依赖项未就绪时直接隐藏开关,用户以为功能缺失。

Design Token 映射

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