Switch 开关
在开与关两种状态间切换的控件
用法
<script setup lang="ts">
import { ref } from 'vue'
const enabled = ref(true)
</script>
<template>
<TuffSwitch v-model="enabled" />
</template>
切换状态
点击、Enter 或 Space 切换。
示例加载中...
尺寸
size 同时决定文案字号与间距。
示例加载中...
禁用
示例加载中...
加载中
等待服务端确认时设置 loading:滑块停在原值并变为旋转环,期间不可切换。
示例加载中...
文案
label 变化时交叉淡入,labelPlacement 决定文案在前或在后。默认插槽原样渲染,不带过渡。
示例加载中...
自定义颜色
覆盖 --tuff-switch-active-color、--tuff-switch-track-color 或 --tuff-switch-thumb-color。
示例加载中...
设置项
状态文本放在开关外部时,用 TxTextTransformer 获得同样的文字过渡。
示例加载中...
最佳实践
- 即时生效的布尔设置用 Switch;随表单提交的选项用 Checkbox。
- 需要服务端确认时设置
loading,成功后再写回modelValue;失败时只撤下loading。 label写控件名称(「紧凑模式」)。「已开启」这类状态文本放在外部,用TxTextTransformer渲染,避免被朗读两次。- 换色只覆盖 CSS 变量,不改写
.tuff-switch__track的样式规则。
API 参考
属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
modelValue | boolean | false | 开关状态,配合 v-model 使用。 |
label | string | - | 轨道旁的文案,变化时交叉淡入。 |
labelPlacement | 'start' | 'end' | 'end' | 文案在轨道前或后。 |
size | 'small' | 'default' | 'large' | 'default' | 尺寸,同时影响文案字号与间距。 |
disabled | boolean | false | 禁止切换,并移出 Tab 序列。 |
loading | boolean | false | 显示旋转环并禁止切换。 |
事件
| 事件名 | 参数 | 说明 |
|---|---|---|
update:modelValue | (value: boolean) => void | 用户切换后触发,参数为新值。 |
change | (value: boolean) => void | 与 update:modelValue 同时触发。 |
插槽
| 插槽名 | Props | 说明 |
|---|---|---|
default | - | 自定义文案,优先于 label;原样渲染,不带过渡。 |
概述
- 根节点是原生
<button role="switch">,带aria-checked。 - 受控组件:切换只派发事件,父级回写
modelValue后外观才更新。 disabled与loading都设置原生disabled;loading不降低透明度,并设置aria-busy="true"。- 有可见文案(
label或插槽)时不渲染aria-label。 - 减少动态效果时,加载环停止旋转。
技术实现
- 状态类
is-active、is-disabled、is-loading、has-label挂在根节点;轨道与滑块是.tuff-switch__track、.tuff-switch__thumb。 - 源码:
packages/tuffex/packages/components/src/switch/。
查看源码
packages/tuffex/packages/components/src/switch/index.ts