Arco Design Switch 开关组件基础用法详解:从最小示例到受控原理 UI组件前端设计系统【免费下载链接】arco-designA comprehensive React UI components library based on Arco Design项目地址https://gitcode.com/gh_mirrors/ar/arco-design点击查看免费下载开关Switch是 Arco Design 数据输入类组件中用于表达互斥状态切换的核心控件用户通过点击在打开 / 关闭两个状态之间切换。本篇基于arco-design/web-react仓库中 Switch 组件的基础用法文档与源码实现带你从import { Switch } from arco-design/web-react这一最小示例出发逐步掌握开关的受控与非受控用法、onChange回调、三种外观类型、尺寸与禁用/加载状态并深入组件源码了解其底层渲染与状态管理原理。安装与引入Switch 组件从组件库根入口统一导出。在仓库中components/index.tsx 负责对外导出Switch及其类型定义export type { SwitchProps } from ./Switch/interface; export { default as Switch } from ./Switch;因此在业务代码中只需一行引入即可使用import { Switch } from arco-design/web-react;组件自身的核心实现位于 components/Switch/index.tsx类型定义位于 components/Switch/interface.ts样式位于 components/Switch/style/index.less 与 components/Switch/style/token.less。最基础的应用一行代码的开关基础用法文档 components/Switch/demo/basic.md 给出了 Switch 最朴素的使用方式——不传任何属性渲染一个默认状态关闭的开关import { Switch } from arco-design/web-react; const App () { return Switch /; }; export default App;这个最小示例背后是完整的默认行为初始状态为关闭checked false点击后切换为打开再次点击恢复关闭循环往复采用默认的circle圆形外观类型未受控状态由组件内部管理。仓库的演示快照 components/Switch/test/snapshots/demo.test.ts.snap 记录了该基础示例的实际 DOM 输出可以直观看到组件最终渲染为一个原生button元素button aria-checkedfalse classarco-switch arco-switch-type-circle roleswitch typebutton div classarco-switch-dot / /button值得注意的细节是开关并非用div或span模拟而是真正的button标签并带有roleswitch与aria-checked属性——这意味着开关天然支持键盘操作与无障碍a11y语义这与 components/Switch/index.tsx 中源码的渲染逻辑完全一致。状态管理受控与非受控基础用法虽然只有一行代码但理解其状态模型是进阶使用的前提。从源码 components/Switch/index.tsx 可以看到 Switch 同时支持受控与非受控两种模式const [checked, setChecked] useStateboolean(props.defaultChecked); const mergedChecked checked in props ? props.checked : checked; const onHandleClick (event) { if (loading) { return; } props.onClick props.onClick(event); if (!(checked in props)) { setChecked(!mergedChecked); } onChange onChange(!mergedChecked, event); };非受控默认不传checked组件内部用useState以defaultChecked为初始值维护状态用户点击后内部自动取反受控传入checked属性后checked in props成立点击不再修改内部 state显示值完全由外部checked决定此时必须配合onChange自行更新状态例如import { useState } from react; import { Switch } from arco-design/web-react; const App () { const [checked, setChecked] useState(true); return ( Switch checked{checked} onChange{(value) setChecked(value)} / ); }; export default App;这种以属性是否存在判断受控与否的写法是 Arco Design 组件库统一的状态管理模式也与仓库测试用例 components/Switch/test/index.test.tsx 中的行为验证一一对应。onChange 回调获取切换结果点击开关时通过onChange回调拿到最新的布尔值这是开关最常用的交互出口常用于联动表单或业务状态import { Switch } from arco-design/web-react; const App () { return ( Switch defaultChecked onChange{(value, event) { console.log(开关状态, value); }} / ); }; export default App;回调签名定义在 components/Switch/interface.ts参数说明value: boolean点击后开关将要切换到的状态已取反后的新值event触发点击的原生事件对象需要注意回调参数value是切换后的新值而非当前值点击后回调传入!mergedChecked。仓库测试 components/Switch/test/index.test.tsx 验证了这一点——defaultChecked的开关被点击后onChange收到的第一个参数为false。此外event参数是在 2.0.0 版本中为onChange新增的见 components/Switch/changelog/index.zh-CN.md。三种外观类型circle / round / line通过type属性可切换三种样式类型默认值为circleimport { Switch, Space } from arco-design/web-react; const App () { return ( Space sizelarge Switch / Switch typeround / Switch typeline / /Space ); };类型说明circle默认类型圆形容器配圆形滑块胶囊式外观round圆角矩形滑块偏直角风格line线型开关容器透明、滑块底部带一条轨道线三种类型在源码中的差异由type派生 class 实现components/Switch/index.tsx具体视觉差异定义在样式文件 components/Switch/style/index.less 中round类型调整了容器与滑块的圆角border-radiusline类型则通过::after伪元素绘制底部轨道switch-line-height-bg-line并将容器背景置为透明。测试用例 components/Switch/test/index.test.tsx 验证了round与line类型会分别挂载arco-switch-type-round、arco-switch-type-line类名。尺寸default 与 small通过size属性可切换开关尺寸Switch / Switch sizesmall /尺寸取值仅有small | default两种默认尺寸下高度为switch-size-defaultsize-6small 尺寸为switch-size-smallsize-4相关 token 定义在 components/Switch/style/token.less。从源码 components/Switch/index.tsx 可以看出size优先级为propSize || ctxSize即组件自身传入的size优先其次继承 ConfigProvider 的全局size配置未设置时走默认尺寸。测试 components/Switch/test/index.test.tsx 验证了sizesmall会生成arco-switch-small类名。禁用与加载状态disabled使开关不可交互loading使开关进入加载中状态且同样不可点击Switch disabled / Switch disabled defaultChecked / Switch loading / Switch loading defaultChecked /这两个属性的行为在源码中有着明确的边界处理components/Switch/index.tsxloading状态下点击事件直接return不会触发任何状态变更与onChange同时tabIndex被设为-1键盘焦点也被移除见渲染部分 components/Switch/index.tsxloading时滑块内的图标会被替换为内置的IconLoading旋转图标components/Switch/index.tsxdisabled通过原生disabled属性施加到button上同时样式层components/Switch/style/index.less为禁用态定义了独立的背景色与文本色 token。测试用例 components/Switch/test/index.test.tsx 专门验证了loading 状态下即使触发点击开关仍保持arco-switch-checked状态不变且滑块内渲染的是arco-icon-loading图标。自定义文案与图标除了基础用法Switch 还支持在打开 / 关闭时展示自定义文案或图标它们与基础用法同属开关键上内容的配置范畴Switch checkedTextON uncheckedTextOFF / Switch checkedText1 uncheckedText0 typeround defaultChecked / Switch checkedIcon{IconCheck /} uncheckedIcon{IconClose /} defaultChecked /checkedText/uncheckedText打开 / 关闭时显示的文案small 尺寸与line类型下不生效源码渲染条件见 components/Switch/index.tsxcheckedIcon/uncheckedIcon打开 / 关闭时滑块内显示的图标切换时通过SwitchTransition包裹的ArcoCSSTransition执行 200ms 的淡入切换动画components/Switch/index.tsx。文案的展开与收起还使用了名为switchSlideText的位移动画其 enter / exit 关键帧定义在 components/Switch/style/index.less。API 完整速查以下为 Switch 全部可用属性整理自组件文档 components/Switch/README.zh-CN.md 与类型定义 components/Switch/interface.ts参数名描述类型默认值checked开关是否打开受控boolean-defaultChecked默认是否选中非受控初始值boolean-disabled是否禁用boolean-loading加载中状态不可点击boolean-size开关尺寸可选small和defaultsmall \| default-type三种样式类型circle \| round \| linecirclecheckedIcon开关打开时按钮上显示的图标ReactNode-checkedText开关打开时的文案small 尺寸不生效ReactNode-uncheckedIcon开关关闭时按钮上显示的图标ReactNode-uncheckedText开关关闭时的文案small 尺寸不生效ReactNode-className节点类名string \| string[]-style节点样式CSSProperties-onChange点击开关的回调(value: boolean, event) void-此外SwitchProps继承了HTMLAttributesHTMLButtonElementcomponents/Switch/interface.ts因此原生button的其它属性如onClick、id、tabIndex等也可直接透传。源码实现要点与可访问性从源码结构components/Switch/index.tsx可以提炼出几个值得借鉴的实现细节原生按钮语义组件渲染为button roleswitch aria-checked{!!mergedChecked} typebutton确保屏幕阅读器能正确朗读开关状态键盘用户也能通过空格 / 回车触发components/Switch/index.tsx组件级默认配置合并通过useMergeProps将用户属性、组件defaultProps与ConfigProvider的componentConfig?.Switch合并components/Switch/index.tsx意味着可在全局统一配置 Switch 的默认行为仓库的componentConfigTest测试components/Switch/test/index.test.tsx验证了这一点children 兼容写法支持通过children传入key为open/close的元素作为文案同时官方建议优先使用checkedText/uncheckedText参数components/Switch/index.tsx事件集成Switch 可作为Popconfirm等弹出组件的触发器正常使用仓库测试 components/Switch/test/index.test.tsx 与变更记录 components/Switch/changelog/index.zh-CN.md 均确认了这一点。测试保障与使用建议Switch 的每个 demo 都会经过自动化测试渲染验证仓库通过 components/Switch/test/demo.test.ts 调用通用的demoTest(Switch)对全部 demo 进行渲染快照保存在 components/Switch/test/snapshots/demo.test.ts.snap行为层面的单元测试集中在 components/Switch/test/index.test.tsx。实际开发中的建议仅需一个开 / 关独立状态时直接使用Switch /的最简形式即可配合onChange读取结果状态由父组件或表单数据驱动时务必使用checkedonChange的受控模式避免状态不同步需要等待异步操作如保存设置时先切换状态、待请求返回后再渲染loading开关可有效防止用户重复点击表单场景中结合 Form 组件使用时小尺寸 Form 下的尺寸继承问题在历史版本中曾修复过见 components/Switch/changelog/index.zh-CN.md若自定义尺寸请显式传入size。以上内容均以当前仓库中 Switch 组件的 demo 文档、API 文档、源码、样式与测试为依据读者可对照 components/Switch/README.zh-CN.md、components/Switch/index.tsx 与 components/Switch/interface.ts 进一步深入阅读。赞分享UI组件前端设计系统【免费下载链接】arco-designA comprehensive React UI components library based on Arco Design项目地址https://gitcode.com/gh_mirrors/ar/arco-design点击查看免费下载相关推荐Ant Design Switch 组件基础用法全解从最小示例到受控状态与源码实现Ant Design Switch 组件基础用法全解从最小示例到受控状态与源码实现 本篇技术指南以 Ant Design 仓库中 components/swi前端UI组件设计系统Czkawka 重复文件清理指南免费用 14 种工具找回磁盘空间Czkawka 重复文件清理指南免费用 14 种工具找回磁盘空间 Czkawka 重复文件清理是一种免费开源的磁盘空间回收方式。它是一套用 Rust 编写的多桌面应用Arco Design Pagination 分页组件基础用法全解析从一行 Pagination total{200} / 到受控分页Arco Design Pagination 分页组件基础用法全解析从一行 Pagination total{200} / 到受控分页 导读 分页PagUI组件前端设计系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考