Skip to content

Switch 开关

在两个互斥状态之间切换。语义上等同于原生复选框,但视觉上表达「开 / 关」。

基础用法

vue
<script setup>
import { ref } from 'vue'
const value = ref(false)
</script>

<template>
  <SrSwitch v-model="value" />
</template>

何时用 Switch、何时用 Checkbox

两者在 HTML 语义上都是「勾选」,选择依据是文案形态

文案形态例子
SrSwitch「开 / 关」式,切换立即生效开启通知、夜间模式
SrCheckbox「选中 / 未选中」式,通常需提交后生效同意条款、批量选择

判断方法:如果文案是「启用某项功能」且切换会马上起作用,用 Switch; 如果是「在一组里挑几个」,用 Checkbox。

切换立即生效

带文字

activeText / inactiveText 在轨道内显示文字。

vue
<SrSwitch v-model="value" active-text="开" inactive-text="关" />

轨道内的文字很窄

两三个字以内才放得下。文字更长时建议把说明放在开关外面—— 塞进轨道会让控件横向撑开,与旁边的表单项对不齐。

加载与禁用

加载中同样不可点击,避免重复触发。禁用时保持视觉可见但不响应, 比直接隐藏更好——用户至少知道这里有个开关。

vue
<SrSwitch v-model="value" loading />
<SrSwitch v-model="value" disabled />

尺寸

vue
<SrSwitch size="sm" />
<SrSwitch size="md" />

Props

名称类型默认值说明
modelValuebooleanfalse当前值
size'sm' | 'md''md'尺寸
disabledbooleanfalse是否禁用
loadingbooleanfalse是否加载中(同样不可点击)
activeTextstring开启态文字
inactiveTextstring关闭态文字

事件

事件参数说明
update:modelValueboolean值变化
changeboolean值变化(语义化事件)

无障碍

  • 使用 role="switch" 而非 role="checkbox":读屏软件会播报「开关」并说明当前 是「开」还是「关」,比「复选框,已选中」更贴合这里的语义
  • 通过 aria-checked 暴露状态,不是靠视觉位置暗示
  • 支持键盘聚焦与空格键切换——这是 role="switch" 的标准交互, 自己拼 div 时最容易漏掉

自用组件库 · 源码分发 · 不发布 npm