跳转到内容

开关 switch

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

示例

基础用法

不传 checked 即为非受控,开关自己维护状态

受控

传了 checked 就由宿主说了算,组件自己不再改状态;v-model:checked 是它的语法糖

当前:开

禁用

disabled 同时挡住指针与键盘,状态机收不到 TOGGLE

语气

tone 决定选中态轨道用哪族颜色,所以这里都置为开

brandneutralsuccesswarningdangerinfo

尺寸

size 同时缩放轨道与滑块,不写就是缺省档

缺省

事件

checked-change 带一份 { checked },非受控时内部转移也照发一次

翻转 0 次 · 最近落到 (还没动过)

自定义颜色

开态轨道、关态轨道与滑块各是一个组件令牌,语气档之外的配色写在行内

轨道内文案与滑块标记

自渲外壳时子节点全由作者决定,data-state 同时打在轨道与滑块上

异步提交

受控开关在回执到达前不落位,提交期间 disabled 挡住重复点击

已关闭

形状

轨道与滑块共用同一个形状令牌,在实例上覆盖一次两者一起变方

直角圆角缺省

随表单提交

给了 name 才生出表单影子:开着才提交,值缺省是 on,与原生复选框一致

产物

自定义元素<xh-switch>
Vue 组件XhSwitch
组合式函数useSwitch
状态机switchMachine
皮肤@xihan-ui/styles/switch.css

解剖

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

data-scope="switch"root · thumb · hidden-input

Props

属性类型必填说明
checkedboolean
defaultCheckedboolean
disabledboolean
namestring表单字段名;给了 hidden-input 才带 name 并参与提交。
valuestring提交出去的值,缺省 'on',与原生复选框一致。
toneTone语气:brand / neutral / success / warning / danger / info,决定选中态轨道用哪族颜色。
sizeSize尺寸:sm / md / lg,决定轨道与滑块的几何档位。
onCheckedChange(details: SwitchCheckedChangeDetails) => voidchecked 变化意图回调;受控时是唯一出口,非受控随内部转移一并通知。

状态机

状态off · on

事件TOGGLE · CONTROLLED.ON · CONTROLLED.OFF · FORM.RESET

判据isCheckedControlled · defaultsToChecked

connect API

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

成员类型说明
checkedboolean
setChecked(next: boolean) => void
getRootProps() => T['button']
getThumbProps() => T['element']
getHiddenInputProps() => T['input']表单影子:勾上才提交。给了 name 才带 name,不给就不参与提交。

键盘

规格出处:W3C APG

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

Released under The MIT License