跳转到内容

切换按钮 toggle

通用组件。三层同源:无头内核给出解剖与状态机,Vue 组件与自定义元素只是它的两层外壳,行为完全一致。

示例

基础用法

按下态由 pressed 表达,非受控时组件自己维护

禁用

disabled 同时挡住指针与键盘,按下态保持原样

排成一组

多个独立的 toggle 各管各的按下态;要互斥或单一 Tab 位请改用切换按钮组

underline

形态

variant 决定颜色怎么用,未按下与已按下两档一起看才完整

未按下
已按下

语气

tone 决定用哪族颜色,与 variant 正交;这里固定 solid 形态并置于按下态,语气差别最明显

尺寸

size 只改高度、内边距与字号,不写就是缺省档

图标

默认插槽收任意内容,图标与文字之间的空隙由 --xh-toggle-gap 给;只放图标时按钮没有可见文字,名字得由 aria-label 补上

变化回调

pressed-change 每次带着 details 报一次按下意图;不接 v-model 时它就是拿到新值的唯一出口

最近三次:(还没动过)

请求在途

受控的 pressed 不写回就不会动,在途期间来的意图直接丢掉;忙碌反馈由 aria-busy 与一枚转圈补在按钮上

点一下,落定要等 1.2 秒

产物

自定义元素<xh-toggle>
Vue 组件XhToggle
组合式函数useToggle
状态机toggleMachine
皮肤@xihan-ui/styles/toggle.css

解剖

部件名即 data-part 属性值,也是皮肤的选择器。加粗的是必备部件,不渲染它组件不工作(Web Components 适配器会在诊断通道上报 wc.missing-part)。

data-scope="toggle"root

Props

属性类型必填说明
pressedboolean
defaultPressedboolean
disabledboolean
variantActionVariant形态:solid / subtle / outline / ghost,决定颜色怎么用
toneTone语气:brand / neutral / success / warning / danger / info,决定用哪族颜色
sizeSize尺寸:sm / md / lg
onPressedChange(details: TogglePressedChangeDetails) => voidpressed 变化意图回调;受控时是唯一出口,非受控随内部转移一并通知。

状态机

状态off · on

事件TOGGLE · CONTROLLED.ON · CONTROLLED.OFF

判据isPressedControlled

connect API

useToggle 产出的对象。getXxxProps() 铺到对应部件的宿主元素上,其余是可读状态与操作入口。

成员类型说明
pressedboolean
setPressed(next: boolean) => void
getRootProps() => T['button']

键盘

规格出处:W3C APG

按键生效条件行为
Space / Enterfocus in root, not disabled切换 pressed 状态

Released under The MIT License