组件

Switch

一个 React 开关,采用 Liquid Glass 滑块、标签、描述与黑白主题。

Switch 渲染带 Liquid Glass 轨道与滑块的两种状态控件。它适合立即生效的设置;需要保持按下状态的单一操作请使用 Toggle。

基础示例

下面的开关来自真实组件,可以直接点击切换。

Receive notificationsWhen enabled, new messages are sent to your inbox.

开关根元素就是最外层元素。视觉轨道是内部的 base 槽位,整行(包括标签和描述)都可以点击。label 会通过 aria-labelledby 成为可访问名称;当控件有标签或显式名称时,description 会通过 aria-describedby 关联。显式传入的 aria-label 或 aria-labelledby 优先决定名称,显式传入的 aria-describedby 会与描述合并。只有 description 的控件会把描述作为名称,不再添加 aria-describedby。

尺寸

支持 xs / sm / md / lg / xl,默认 md。轨道与文字会随 size 缩放。

XSSMMDLGXL

受控用法

checked 与 onCheckedChange 让开关状态完全由外部状态控制:

Receive notificationsNew messages will be sent to your inbox.

非受控用法

不传 checked 时,Switch 自己维护状态,defaultChecked 只作为初始值:

Enable notificationsNew messages will be sent to your inbox.

表单用法

Switch 会把 name 与 value 用于表单,并在提交时通过隐藏的 checkbox input 发送当前值:

Receive notificationsWhen enabled, new messages are sent to your inbox.

Not submitted yet

禁用与只读

DisabledRead-only

无障碍

Switch 渲染带 role="switch" 与 aria-checked 的可聚焦元素(默认是 <span>)。可见的 label 为其命名,description 通过 aria-describedby 关联;显式 ARIA 名称优先。

Space 切换当前控件。隐藏复选框携带 name 与 value 用于表单提交,readOnly 会阻止修改但保留焦点。表单模式见可访问性指南。

API 参考

属性类型默认值说明
labelReactNode—可见标签;未提供 aria-label 或 aria-labelledby 时会成为可访问名称。
descriptionReactNode—辅助说明;控件有名称时会通过 aria-describedby 关联。
size"xs" | "sm" | "md" | "lg" | "xl""md"控制开关尺寸与文字大小。
checkedboolean—受控选中状态。
defaultCheckedbooleanfalse非受控初始状态。
onCheckedChange(checked: boolean, details) => void—选中状态变化时调用。
disabledbooleanfalse禁用开关。
readOnlybooleanfalse只读,不允许切换,但仍可聚焦。
requiredbooleanfalse表单提交前必须开启。
namestring—表单字段名。
formstring—拥有隐藏输入框的表单 ID。
valuestring—开启时随表单提交的值。
uncheckedValuestring—关闭时随表单提交的值。
idstring—隐藏输入框的 ID;当 nativeButton 为 true 时改为根元素的 ID。
inputRefRef<HTMLInputElement>—指向隐藏原生输入框的 ref。
nativeButtonbooleanfalse是否渲染原生 <button>。
renderReactElement | ((props, state) => ReactElement)—替换根元素。
refRef<HTMLElement>—转发到根元素的 ref。
classNamestring—Tailwind 类名,合并到 switch root。
styleCSSProperties—内联样式,合并到与 className 相同的元素。
ui{ root?: ClassValue; container?: ClassValue; base?: ClassValue; thumb?: ClassValue; wrapper?: ClassValue; label?: ClassValue; description?: ClassValue }—按 data-slot 组织的内部槽位类名。
属性说明
data-checked开关开启时存在。
data-unchecked开关关闭时存在。
data-disabled开关禁用时存在。
data-readonly开关只读时存在。
data-required开关必填时存在。
data-valid开关包裹在 Field 中且有效时存在。
data-invalid开关包裹在 Field 中且无效时存在。
data-touched开关包裹在 Field 中并被触碰后存在。
data-dirty开关包裹在 Field 中且值变化后存在。
data-filled开关包裹在 Field 中且开启时存在。
data-focused开关包裹在 Field 中且聚焦时存在。
data-animatingthumb 过渡动画运行时存在。
data-slot标记内部部件(root、container、base、thumb、wrapper、label、description),用于样式选择。

主题

轨道和 thumb 使用 --ui-ink 与 --ui-surface;组件级几何数值位于 src/theme/switch.ts,包括 --ui-switch-width、--ui-switch-height、--ui-switch-inset、--ui-switch-thumb-size 和 --ui-switch-travel。可以在 Switch 上通过 style 覆盖这些变量,用 className 控制布局,并通过 ui 按 data-slot 调整内部槽位。Token 分层与预设见主题指南。

相关组件

  • Checkbox — 随表单一起确认的选择。
  • Radio Group — 从多个选项中选择一个。
  • Toggle — 保持按下状态的按钮。