跳转到内容

数字输入 number-field

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

示例

基础用法

加减按钮与输入框共用一份状态;值是原始输入串,不传 value 即为非受控

区间与步长

方向键走 step,PageUp 与 PageDown 走 largeStep,Home 与 End 取端点;贴到边界时对应按钮转灰

数值:10 · 可加:是 · 可减:是

受控

传了 value 就由宿主说了算;value-change 除了原始串还带一份 valueAsNumber

输入串:3 · 数值:3

禁用与只读

两者都改不动值,禁用还会把加减按钮一并关掉、值也不再随表单提交

形态

variant 只改皮肤怎么用颜色,加减与键盘行为三档完全一致

语气

tone 决定用哪族颜色,与 variant 正交;这里固定 outline 只看语气的差别

尺寸

输入框高度与加减按钮一起换档,不传 size 即默认档

只用输入框

加减钮是可选部件,不渲染它照样能改值:方向键走 step,PageUp 与 PageDown 走 largeStep

点进框里按上下键:60

加减钮排布

两个触发器摆在哪儿由作者写模板决定,钮里放什么字符也一样;行为不随位置变

校验态

invalid 由宿主自己判定,不必挂在表单上;标出来之后值照样能改、加减钮照样能按

库存只有 5 件

框内单位与货币符号

前后缀压在输入框上,输入框自己让出内边距;加减钮照旧摆在包裹层里

¥
g

固定小数位

步进本身带定点规整,宿主在离开输入框与松开加减钮时把值补齐到两位小数

当前:12.50

提交时机

输入途中只动草稿,失焦或回车才把值交给业务模型;不合法就退回上一次提交的值

草稿:3 · 已提交:3

产物

自定义元素<xh-number-field>
Vue 组件XhNumberFieldDecrementTrigger XhNumberFieldIncrementTrigger XhNumberFieldInput XhNumberFieldLabel XhNumberFieldRoot
组合式函数useNumberField
状态机numberFieldMachine
皮肤@xihan-ui/styles/number-field.css

解剖

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

data-scope="number-field"root · label · input · increment-trigger · decrement-trigger

Props

属性类型必填说明
valuestring
defaultValuestring
minnumber
maxnumber
stepnumber方向键与加减按钮的步长,默认 1。
largeStepnumberPageUp / PageDown 的步长,默认 10 倍 step。
disabledboolean
readOnlyboolean
requiredboolean
invalidboolean
namestring表单字段名;给了才参与提交。
changeDelaynumber按住加减按钮多久开始连发,默认 300ms。
changeIntervalnumber连发间隔,默认 50ms。
variantControlVariant形态:outline / subtle / ghost,决定输入框与加减钮的底与描边怎么画。
toneTone语气:brand / neutral / success / warning / danger / info,决定聚焦强调用哪族颜色。
sizeSize尺寸:sm / md / lg,决定输入框与加减钮的几何档位。
onValueChange(details: NumberFieldValueChangeDetails) => void

状态机

状态idle · spinning

事件VALUE.SET · VALUE.STEP · VALUE.TO_MIN · VALUE.TO_MAX · INPUT.BLUR · PRESS.START · PRESS.END · after.changeInterval · FORM.RESET

判据canStep

connect API

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

成员类型说明
valuestring
valueAsNumbernumber
emptyboolean值为空或非法。
disabledboolean
readOnlyboolean
invalidboolean
canIncrementboolean
canDecrementboolean
setValue(next: string) => void
increment() => void
decrement() => void
getRootProps() => T['element']
getLabelProps() => T['label']
getInputProps() => T['input']
getIncrementTriggerProps() => T['button']
getDecrementTriggerProps() => T['button']

键盘

规格出处:W3C APG

按键生效条件行为
ArrowUpfocus in input, not disabled/readOnly按 step 递增,越界则停在 max
ArrowDownfocus in input, not disabled/readOnly按 step 递减,越界则停在 min
PageUpfocus in input, not disabled/readOnly按 largeStep 递增(默认 10 倍 step)
PageDownfocus in input, not disabled/readOnly按 largeStep 递减
Homefocus in input, 指定了 min取 min;未指定 min 时不动
Endfocus in input, 指定了 max取 max;未指定 max 时不动

Released under The MIT License