Semi Design Switch 开关组件完全指南:API、受控模式、无障碍与源码实现解析

发布时间:2026/9/25 15:23:15

Semi Design Switch 开关组件完全指南:API、受控模式、无障碍与源码实现解析 前端UI组件设计系统【免费下载链接】semi-designA modern, comprehensive, flexible design system and React UI library, AI-friendly built-in.Provide 3000 Design Tokens, easy to build your design system. Make Semi Design to Any Design.‍ Design to Code in one click项目地址https://gitcode.com/gh_mirrors/se/semi-design点击查看免费下载本指南以 Semi Designdouyinfe/semi-ui开源仓库中 Switch 开关组件的官方文档为主体系统讲解该组件的引入方式、受控/非受控用法、尺寸与状态禁用、加载中、内嵌文本配置、完整 API、无障碍ARIA 与键盘操作及文案规范并结合仓库源码组件层、foundation 层、SCSS 主题变量与测试用例深入解析其底层实现原理。读完本文你将能够在 Semi Design 项目中正确、规范地使用 Switch并理解其 原生 checkbox ARIA 增强 的实现机制为定制主题或排查交互问题提供依据。组件概览与适用场景Switch 是 Semi Design 中用于切换两种互斥状态的交互组件官方文档定义为an interactive form used to switch two mutually exclusive states。与 Checkbox 的多选一语义不同Switch 表达的是一种即时生效的二元状态切换常见于设置面板、偏好开关、权限控制等场景例如开启/关闭消息通知、暗色模式切换、自动续费开关等。在 Semi Design 组件树中Switch 属于输入类Input组件位于 content/input/switch/index-en-US.md其组件实现位于 packages/semi-ui/switch/index.tsx底层逻辑foundation位于 packages/semi-foundation/switch/foundation.ts样式与主题变量位于 packages/semi-foundation/switch/switch.scss 与 packages/semi-foundation/switch/variables.scss。引入方式从douyinfe/semi-ui按需引入即可import { Switch } from douyinfe/semi-ui;Semi Design 采用组件级分包管理monorepo 结构Switch 的 UI 实现、foundation 逻辑与 SCSS 样式分属不同包但对外统一由semi-ui聚合导出使用者无需关心底层拆分。基本用法监听状态与设定初始选中你可以通过onChange监听状态变化通过defaultChecked非受控或受控的checked制定选中状态。官方建议通过aria-label描述该 Switch 的具体作用以保证可访问性import React from react; import { Switch } from douyinfe/semi-ui; () ( div Switch onChange{(v, e) console.log(v)} aria-labela switch for demo/Switch br / Switch defaultChecked{true} onChange{(v, e) console.log(v)} aria-labela switch for demo/Switch /div );要点说明onChange回调签名是(checked: boolean, e: React.ChangeEventHTMLInputElement) void第一个参数即最新的选中值第二个参数是原生 change 事件见 packages/semi-ui/switch/index.tsx 中SwitchProps的类型定义。defaultChecked仅在组件首次挂载时生效用于非受控场景后续状态由组件内部维护。未指定任何选中属性时Switch 默认处于未选中态checked的默认值为false。受控组件完全由外部状态驱动组件是否选中完全取决于传入的checked值配合onChange回调函数使用。这是典型的受控写法import React from react; import { Switch } from douyinfe/semi-ui; () { const [checked, setChecked] useState(true); const onChange (checked) { setChecked(checked); }; return ( Switch checked{checked} aria-labela switch for demo onChange{onChange} / ); };受控/非受控的底层判定逻辑从 foundation 源码可以看到 Semi 如何区分两种模式packages/semi-foundation/switch/foundation.ts 的handleChangehandleChange(checked: boolean, e: any): void { const propChecked this.getProps().checked; const isControlledComponent typeof propChecked ! undefined; if (isControlledComponent) { this._adapter.notifyChange(checked, e); } else { this._adapter.setNativeControlChecked(checked); this._adapter.notifyChange(checked, e); } }受控模式只要外部传入了checked属性typeof propChecked ! undefined点击开关时只回调onChange不直接修改内部状态最终选中态由父组件通过新checked值决定。非受控模式内部先更新nativeControlChecked状态再通知onChange。组件层在componentDidUpdate中会监听checked属性变化并同步内部状态this.foundation.setChecked(this.props.checked)保证受控模式外部状态回写生效。仓库测试 packages/semi-ui/switch/test/switch.test.js 的 switch controlled mode 用例也验证了这一行为模拟 change 事件后onChange被调用一次外部更新checked后组件 DOM 呈现选中态。尺寸Size通过size属性指定尺寸可选值为large、default、small默认值为default该枚举定义在 packages/semi-foundation/switch/constants.ts 的SIZE_MAP: [default, small, large]组件 propTypes 通过PropTypes.oneOf约束。import React from react; import { Switch } from douyinfe/semi-ui; () ( div Switch sizesmall aria-labela switch for demo/Switch Switch defaultChecked{true} sizesmall aria-labela switch for demo/Switch Switch sizesmall loading aria-labela switch for demo / Switch sizesmall loading defaultChecked{true} aria-labela switch for demo / br / br / Switch/Switch Switch defaultChecked{true}/Switch Switch loading / Switch loading defaultChecked{true} / br / br / Switch sizelarge/Switch Switch defaultChecked{true} sizelarge/Switch Switch sizelarge loading / Switch sizelarge loading defaultChecked{true} / /div );三种尺寸的实际几何尺寸来自主题变量结合 packages/semi-foundation/switch/variables.scss 的 SCSS 变量三种尺寸的实体规格如下尺寸开关宽 × 高滑块直径选中态滑块位移圆角small26px × 16px12px11px高度的一半8pxdefault40px × 24px18px18px高度的一半12pxlarge54px × 32px24px26px高度的一半16px相关变量包括$width-switch、$width-switch_large、$width-switch_small、$spacing-switch_checked-translateX等且圆角统一定义为$radius-switch: $height-switch * 0.5胶囊造型。滑块按压时还会延展$width-switch_knob_expand: 6pxlarge 为 10px、small 为 2px配合 200ms 的transform过渡$motion-switch-transitionDuration: 200ms形成按压反馈的弹性动画。禁用状态Disabled设置disabled后开关不可交互未选中时以透明背景 描边呈现选中时使用禁用色填充import React from react; import { Switch } from douyinfe/semi-ui; () ( div Switch disabled aria-labela switch for demo/Switch br / Switch disabled checked{true} aria-labela switch for demo/Switch /div );实现层面packages/semi-ui/switch/index.tsx 的render根节点加上semi-switch-disabledclassSCSS 中cursor: not-allowed并使用--semi-color-border描边见 packages/semi-foundation/switch/switch.scss。原生 checkbox 同时被设置disabled与pointer-events: none阻断一切点击事件。组件在componentDidUpdate中监听disabled属性变化并同步nativeControlDisabled内部状态。仓库测试 packages/semi-ui/switch/test/switch.test.js 的 switch disabled when props.disabled 用例验证了disabled从true切到false时semi-switch-disabledclass 与内部nativeControlDisabled状态同步移除。带文本checkedText / uncheckedText可以通过checkedText与uncheckedText设置开关内嵌文本开启时展示内容 / 关闭时展示内容。注意此项功能在最小的开关即sizesmall时无效。import React from react; import { Switch } from douyinfe/semi-ui; () ( div Switch checkedTexton uncheckedTextoff / Switch checkedText uncheckedText〇 style{{ marginLeft: 5 }} / br / br / Switch defaultChecked checkedTexton uncheckedTextoff / Switch defaultChecked checkedText uncheckedText〇 style{{ marginLeft: 5 }} / br / br / Switch checkedTexton uncheckedTextoff sizelarge / Switch checkedText uncheckedText〇 sizelarge style{{ marginLeft: 5 }} / br / br / Switch defaultChecked checkedTexton uncheckedTextoff sizelarge / Switch defaultChecked checkedText uncheckedText〇 sizelarge style{{ marginLeft: 5 }} / /div );实现细节见 packages/semi-ui/switch/index.tsx 的renderconst showCheckedText checkedText nativeControlChecked size ! small; const showUncheckedText uncheckedText !nativeControlChecked size ! small;只有size ! small时才会渲染文本节点semi-switch-checked-text/semi-switch-unchecked-text这正是文档所说small 尺寸下无效的代码依据。文本节点带有x-semi-prop标记便于 Semi 的 Design to Code 能力识别。SCSS 中文本区域宽 20pxlarge 尺寸为 26px开启态文本颜色为--semi-color-white关闭态为--semi-color-text-2。推荐将文本说明放在 Switch 外部相比于通过checkedText与uncheckedText设置内嵌文本官方更推荐将文本说明放置在 Switch 外部并用开关状态驱动外部文案import React, { useState } from react; import { Switch, Typography } from douyinfe/semi-ui; () { const [open, setOpen] useState(); const { Title } Typography; return ( div style{{ display: flex, alignItems: center }} Title heading{6} style{{ margin: 8 }} {open ? Open : Closed} /Title Switch checked{open} onChange{setOpen} / /div ); };这种做法的优势长文本不受开关尺寸限制、布局更灵活、文案更清晰且能天然获得可读的标签有利于无障碍。加载中状态loading通过设置loadingtrue开启加载中状态。加载时开关内部渲染 Spin 加载图标而非滑块同时禁用交互import React from react; import { Switch } from douyinfe/semi-ui; () ( div Switch loading / br / Switch loading defaultChecked{true} / /div );实现层面packages/semi-ui/switch/index.tsxloading时用Spin替换滑块节点Spin 尺寸跟随开关尺寸size default ? middle : size并套用semi-switch-loading-spinclass。原生 checkbox 的disabled同时被设为nativeControlDisabled || loading即加载中同样不可点击。SCSS 中加载态背景使用--semi-color-fill-1关闭态/--semi-color-success-hover开启态spin 颜色为--semi-color-white并按尺寸10px / 18px / 28px缩放图标见 packages/semi-foundation/switch/switch.scss。API 参考以下为 Switch 完整 API 表来源content/input/switch/index-en-US.md属性说明类型默认值版本aria-label用来给当前元素加上的标签描述用于屏幕上没有可见文本标签的场景提升可访问性string2.2.0aria-labelledby表明某些元素的 id 是某一对象的标签用于建立控件组与其标签之间的联系提升可访问性string2.2.0className外层元素的 CSS 类名stringchecked指示当前是否选中配合 onChange 使用受控booleanfalsecheckedText打开时展示的内容size 为 small 时无效ReactNodedefaultChecked组件挂载初始化时是否选中非受控booleanfalsedisabled是否禁用booleanfalseloading设置加载状态booleanfalseonChange变化时回调函数function(checked: boolean)onMouseEnter鼠标移入时回调function()onMouseLeave鼠标移出时回调function()size尺寸可选值large、default、smallstringdefaultstyle内联样式objectuncheckedText关闭时展示的内容size 为 small 时无效ReactNode说明组件层还支持aria-describedby、aria-errormessage、aria-invalid、id等属性见 packages/semi-ui/switch/index.tsx 的SwitchProps与propTypes这些属性会直接透传到内部原生 checkbox 上属于文档 API 表之外的扩展能力。默认值disabled: false、onChange: noop、loading: false、onMouseEnter: noop、onMouseLeave: noop、size: default由组件defaultProps提供并可通过全局配置覆盖getDefaultPropsFromGlobalConfig。无障碍AccessibilitySemi Design 对 Switch 的无障碍支持包含 ARIA 语义与键盘操作两个层面。ARIASwitch 具有switchrole当checked为true时aria-checked会被自动设置为true反之亦然。作为表单控件Switch 应该带有 Label当你使用Form.Switch时Label 会被自动带上。如果你单独使用 Switch建议使用aria-label描述当前标签作用。这些语义在 packages/semi-ui/switch/index.tsx 的渲染逻辑中直接体现内部渲染一个typecheckbox的原生 input视觉上透明覆盖显式设置roleswitch、aria-checked{nativeControlChecked}并透传aria-label/aria-labelledby/aria-describedby/aria-invalid/aria-errormessage/aria-disabled。因此虽然视觉上看到的是自定义轨道与滑块但屏幕阅读器读到的是语义完整的 switch 控件。键盘和焦点键盘用户可以使用Tab及Shift Tab切换焦点。聚焦时可以通过Space键切换开启或关闭状态原生 checkbox 的键盘行为 roleswitch语义组合而成。焦点视觉反馈由 foundation 的handleFocusVisible实现在 focus 事件中检测target.matches(:focus-visible)决定是否设置focusVisible状态触发时根节点添加semi-switch-focusclass 并显示 2px 的--semi-color-primary-light-active轮廓见 packages/semi-foundation/switch/foundation.ts 与 packages/semi-foundation/switch/switch.scss。若浏览器不支持:focus-visible会发出 warning 提示。文案规范Content Guidelines官方对 Switch 的描述文案给出三条规范源自 content/input/switch/index-en-US.md首字母大写不需要标点符号。间接明了地说明该设置的开启或关闭状态。如果需要解释给用户开启和关闭状态所代表的情况。即文案应简洁、语义明确让用户无需阅读说明即可理解该开关控制什么功能。设计变量Design TokensSwitch 的视觉完全由 Semi 的设计变量Design Tokens驱动可通过主题定制改变外观。核心变量见 packages/semi-foundation/switch/variables.scss包括背景色关闭态var(--semi-color-fill-0)hover 为 fill-1按下为 fill-2开启态var(--semi-color-success)hover 为 success-hover按下为 success-active禁用态使用--semi-color-border描边与--semi-color-success-disabled填充。滑块--semi-white背景、--semi-color-border描边按下时延展宽度实现按压反馈。位移滑块开启/关闭位移2px ↔ 18pxlarge 为 3px ↔ 26pxsmall 为 1px ↔ 11px。动画背景色与滑块 transform 过渡时长为 200ms。圆角为高度的一半保持胶囊造型。由于这些变量全部基于 Semi 的全局语义色板--semi-color-*在暗色模式与主题定制content/advanced/customize-theme/index.md下无需改动组件即可自动适配。源码结构与测试验证若需深入源码可按以下路径查阅组件层packages/semi-ui/switch/index.tsx —— 负责状态管理、class 拼接、ARIA 属性透传、Spin/滑块渲染。逻辑层packages/semi-foundation/switch/foundation.ts —— 受控/非受控判定、禁用同步、focus-visible 处理。常量packages/semi-foundation/switch/constants.ts —— CSS class 前缀与尺寸枚举。样式packages/semi-foundation/switch/switch.scss含 animation.scss、rtl.scss与 variables.scss。测试packages/semi-ui/switch/test/switch.test.js —— 覆盖 className/style、checkedText/uncheckedText 渲染、disabled 切换、onChange 调用、onMouseEnter/onMouseLeave、尺寸 class、受控模式等行为可作为使用与二次开发的回归参考。Storybook 示例packages/semi-ui/switch/_story/switch.stories.tsx。从源码结构看Switch 采用 Semi 统一的 组件层 foundation 层 架构组件层只负责渲染与事件转发业务逻辑集中在可跨框架复用的 foundation 中这也是 Semi Design 支持多端/多框架如 Web Components见 content/ecosystem/web-components/index.md的基础设计。总结Semi Design 的 Switch 是一个功能完整、无障碍友好的二元状态切换组件通过defaultChecked/checked可灵活选择受控与非受控模式size、disabled、loading、checkedText/uncheckedText覆盖了常见交互需求底层基于原生 checkbox 叠加roleswitch与aria-checked的增强实现保证了键盘可达与屏幕阅读器兼容全部视觉细节由 Design Tokens 驱动天然支持主题定制。结合本文给出的源码路径与测试用例你可以放心地在生产项目中接入 Switch并在需要时深入定制。赞分享前端UI组件设计系统【免费下载链接】semi-designA modern, comprehensive, flexible design system and React UI library, AI-friendly built-in.Provide 3000 Design Tokens, easy to build your design system. Make Semi Design to Any Design.‍ Design to Code in one click项目地址https://gitcode.com/gh_mirrors/se/semi-design点击查看免费下载相关推荐Semi Design Switch 开关组件完全指南从基础用法到源码级原理与无障碍设计Semi Design Switch 开关组件完全指南从基础用法到源码级原理与无障碍设计 本篇技术指南围绕 Semi Design React UI 库中的前端UI组件设计系统Semi Design Notification 组件完全指南API 用法、底层实现与无障碍实践Semi Design Notification 组件完全指南API 用法、底层实现与无障碍实践 Notification 是 Semi Design d前端UI组件设计系统react-native-web CheckBox 组件完全指南受控状态、API 与无障碍实现解析react native web CheckBox 组件完全指南受控状态、API 与无障碍实现解析 CheckBox 是 react native web 提前端UI组件跨平台上一篇群晖NAS网速翻倍r8152驱动保姆级安装与调优实战指南下一篇物联大师快速上手指南5分钟部署一个免费轻量级物联网平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/25 15:23:15

Cloudflare 521错误根因与实战修复指南

1. 什么是Cloudflare 521错误?它到底在“拒绝”谁?Cloudflare 521错误——这个在运维日志里频繁跳出来的红色告警,不是服务器宕机,也不是网络中断,而是一次精准的“握手失败”。它的官方定义是“Web server is down”&…

2026/9/25 15:18:14

通信型CRM设计解析:从客户档案到全渠道沟通的落地实践

1. 开局:先弄清楚DeskcommCRM这名字到底在说什么我第一次看到“DeskcommCRM”这个词,第一反应是:这名字拆开读,其实是三个意思叠在一起——Desk、Comm、CRM。Desk指的是桌面端和坐席工作台,Comm指的是Communication&am…

2026/9/25 16:13:17

昇腾正式接入PyTorch官网:从插件到官方硬件后端的实战解析

1. 从“插件”到“一等公民”:昇腾接入 PyTorch 官网这件事到底意味着什么如果你最近在折腾深度学习环境,尤其是关注国产算力这一块,大概率已经刷到过“昇腾进了 PyTorch 官网”这个消息。我第一时间看到的时候,反应不是“又多了一…

2026/9/25 16:13:17

大模型全栈协同实战:从芯片到框架的推理部署与性能调优

1. 大模型规模膨胀背后的真实算力账本这两年做大模型相关的工作,最直观的感受就是参数量的膨胀速度远超预期。2023年大家还在讨论7B、13B的模型怎么微调,到了2024年下半年,70B起步、动辄几百B的MoE架构已经成了主流讨论对象,再到2…

2026/9/25 16:13:17

VMware Workstation安装CentOS 7.9实战指南

1. 项目概述:为什么现在还要手把手教VMware装Linux?“VMware虚拟机安装Linux教程(超详细)”——这个标题看起来像十年前的老古董,但现实是:我上周刚帮三位刚转行的运维新人重装了第5台CentOS 7.9虚拟机&…

2026/9/25 16:13:17

二阶巴特沃斯带通滤波器:MATLAB实现与工程避坑指南

1. 从哪里开始:为什么一个“二阶带通”值得专门写一篇先交代下背景。我最近在调一个振动信号分析的小项目,传感器采回来的数据里,既有设备本身的工频干扰,又有我们真正关心的9~11Hz特征分量。目标很明确:把有用频段提出…

2026/9/25 16:08:17

Unity安装VS2019失败排查指南:从安装报错到编辑器关联修复

1. 为什么Unity装不上VS2019这件事值得单独拿出来说如果你在Unity里点了"Install with Unity"或者手动去装Visual Studio 2019,结果卡在下载、卡在安装、卡在"正在配置"然后弹一个没头没尾的错误码——恭喜你,你踩的是UnityVS2019这…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:02:35

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:02:35

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑