开关
使用开关切换两种状态之间。
何时使用
- 需要表示开关状态/两种状态之间的切换时;
- 和
checkbox的区别是,切换switch会直接触发状态改变,而checkbox一般用于状态标记,需要和提交操作配合。
代码演示
-
基本 ·
basic -
不可用 ·
disabled -
文字和图标 ·
text -
两种大小 ·
size -
加载中 ·
loading -
自定义语义结构的样式和类 ·
style-class
API
通用属性参考:通用属性
| 参数 | 说明 | 类型 | 默认值 | 版本 | 全局配置 |
|---|---|---|---|---|---|
| checked | 指定当前是否选中 | boolean | false | × | |
| checkedChildren | 选中时的内容 | ReactNode | - | × | |
| classNames | 用于自定义组件内部各语义化结构的 class,支持对象或函数 | Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string> | - | 6.0.0 | |
| defaultChecked | 初始是否选中 | boolean | false | × | |
| defaultValue | defaultChecked 的别名 | boolean | - | 5.12.0 | × |
| disabled | 是否禁用 | boolean | false | × | |
| loading | 加载中的开关 | boolean | false | × | |
| size | 开关大小,可选值:medium small | 'medium' | 'small' | medium | × | |
| styles | 用于自定义组件内部各语义化结构的行内 style,支持对象或函数 | Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties> | - | 6.0.0 | |
| unCheckedChildren | 非选中时的内容 | ReactNode | - | × | |
| value | checked 的别名 | boolean | - | 5.12.0 | × |
| onChange | 变化时的回调函数 | function(checked: boolean, event: Event) | - | × | |
| onClick | 点击时的回调函数 | function(checked: boolean, event: Event) | - | × |
方法
| 名称 | 描述 |
|---|---|
| blur() | 移除焦点 |
| focus() | 获取焦点 |
Semantic DOM
| 语义节点 | 原生说明 | 版本 |
|---|---|---|
root | 根元素,包含最小宽度、高度、行高、垂直对齐、背景色、边框、圆角、光标样式、过渡动画、用户选择等开关容器的基础样式 | 6.0.0 |
content | 内容元素,包含块级显示、溢出隐藏、圆角、高度、内边距、过渡动画等开关内容区域的布局和样式 | 6.0.0 |
indicator | 指示器元素,包含绝对定位、宽度、高度、背景色、圆角、阴影、过渡动画等开关把手的样式和交互效果 | 6.3.0 |
语义说明来源: vendor/components/switch/demo/_semantic.tsx
主题变量(Design Token)
类型、继承关系和原生令牌声明保持固定源码原文;默认值由原生主题计算,并可能受 ConfigProvider 覆盖。本表不伪造静态默认值。
| 令牌 | 类型 | 原生说明 |
|---|---|---|
trackHeight | number | string | 开关高度 |
trackHeightSM | number | string | 小号开关高度 |
trackMinWidth | number | string | 开关最小宽度 |
trackMinWidthSM | number | string | 小号开关最小宽度 |
trackPadding | number | 开关内边距 |
handleBg | string | 开关把手背景色 |
handleShadow | string | 开关把手阴影 |
handleSize | number | 开关把手大小 |
handleSizeSM | number | 小号开关把手大小 |
innerMinMargin | number | 内容区域最小边距 |
innerMaxMargin | number | 内容区域最大边距 |
innerMinMarginSM | number | 小号开关内容区域最小边距 |
innerMaxMarginSM | number | 小号开关内容区域最大边距 |
声明来源: vendor/components/switch/style/index.ts
import type { CSSObject } from '@ant-design/cssinjs';
import { unit } from '@ant-design/cssinjs';
import { FastColor } from '@ant-design/fast-color';
import { genFocusStyle, resetComponent } from '../../style';
import { genNoMotionRawStyle, genNoMotionStyle } from '../../style/motion';
import type { FullToken, GenerateStyle, GetDefaultToken } from '../../theme/internal';
import { genStyleHooks, mergeToken } from '../../theme/internal';
export interface ComponentToken {
/**
* @desc 开关高度
* @descEN Height of Switch
*/
trackHeight: number | string;
/**
* @desc 小号开关高度
* @descEN Height of small Switch
*/
trackHeightSM: number | string;
/**
* @desc 开关最小宽度
* @descEN Minimum width of Switch
*/
trackMinWidth: number | string;
/**
* @desc 小号开关最小宽度
* @descEN Minimum width of small Switch
*/
trackMinWidthSM: number | string;
/**
* @desc 开关内边距
* @descEN Padding of Switch
*/
trackPadding: number;
/**
* @desc 开关把手背景色
* @descEN Background color of Switch handle
*/
handleBg: string;
/**
* @desc 开关把手阴影
* @descEN Shadow of Switch handle
*/
handleShadow: string;
/**
* @desc 开关把手大小
* @descEN Size of Switch handle
*/
handleSize: number;
/**
* @desc 小号开关把手大小
* @descEN Size of small Switch handle
*/
handleSizeSM: number;
/**
* @desc 内容区域最小边距
* @descEN Minimum margin of content area
*/
innerMinMargin: number;
/**
* @desc 内容区域最大边距
* @descEN Maximum margin of content area
*/
innerMaxMargin: number;
/**
* @desc 小号开关内容区域最小边距
* @descEN Minimum margin of content area of small Switch
*/
innerMinMarginSM: number;
/**
* @desc 小号开关内容区域最大边距
* @descEN Maximum margin of content area of small Switch
*/
innerMaxMarginSM: number;
}
interface SwitchToken extends FullToken<'Switch'> {
switchDuration: string;
switchColor: string;
switchDisabledOpacity: number;
switchLoadingIconSize: number | string;
switchLoadingIconColor: string;
switchHandleActiveInset: string;
}
FAQ
为什么在 Form.Item 下不能绑定数据?
Form.Item 默认绑定值属性到 value 上,而 Switch 的值属性为 checked。你可以通过 valuePropName 来修改绑定的值属性。
<Form.Item name="fieldA" valuePropName="checked">
<Switch />
</Form.Item>
原生通用属性
Tips: 以下通用属性适用于 antd 大部分组件,不支持的组件会单独说明。
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| style | 自定义样式 | CSSProperties | - |
| className | 自定义类名 | string | - |
| rootClassName | 添加在组件最外层的 className | string | - |
| autoFocus | 自动获取焦点,仅对表单类、链接、交互容器等可聚焦元素生效 | boolean | false |
安装并复现示例
npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23
使用 ConfigProvider 和原生 App,并单独配置 dayjs 语言。每个示例在查看代码中列出完整源码文件和额外固定依赖。示例名称用于选择演示,不是组件通用属性。主题、语言与 SSR 初始化见资源安装指南。
原生类型参考
源码查看器包含未修改的原生实现和以下声明文件,继承类型仍位于原生包中。代码中的英文注释保留为源码参考。
vendor/components/switch/index.tsxvendor/components/switch/style/index.ts
来源与许可
https://github.com/ant-design/ant-design/tree/4a39f54842eade4e565ab336ef6097cd7e723cdd
保留原生中英文正文与可执行示例;官网专用的嵌入章节和令牌表格在本地展开。Ant Design 使用 MIT 许可,另列依赖的许可证也需保留。上传预览禁止向外发起请求,不提供后端服务。