NumberInput 数字输入
数字输入框,输入能力与 TextInput 一致。
基本用法
值类型为 number | ''——清空输入或键入非数字内容时即无值。
当前值:5
步进
三个步进通道,日常步距都是 buttonStep:
- 加减按钮:
showButtons(默认开启)渲染两侧按钮,是纯装饰元素(aria-hidden、不参与 Tab 序),点击不会抢走输入框焦点;disabled或readOnly时一并禁用。 - 键盘:↑/↓ 按
buttonStep步进,PgUp/PgDn 按pageStep(默认buttonStep的 10 倍)。 - 滚轮:仅输入框聚焦时生效(上滚加、下滚减),并阻止页面滚动;悬停未聚焦时不拦截,避免滚动页面误改数值。
步进时数值会收敛:结果钳制到 [min, max] 区间并取 step 的倍数;当前无值('')时步进从 0 起步。收敛只发生在步进时——直接键入的越界值或非 step 倍数原样保留,由软校验标红。
范围与步距
min/max:合法区间,同时写成<input>的min/max属性。step:合法性步距——值必须是它的倍数才算合法;缺省不限制小数(属性输出step="any")。buttonStep:按钮 / 方向键 / 滚轮的实际步距,缺省取step(再缺省为 1)。pageStep:PgUp/PgDn 的步距,缺省为buttonStep的 10 倍。
软校验
内置合法性判定,值不满足时输入元素输出 aria-invalid、根元素叠加 invalid 标志类,但不 改写值:
- 空值:
required时非法,且挂载时即校验(空值 + 必填,加载就标红); - 非有限数值、不是
step的倍数、超出[min, max]区间。
触发时机与 TextInput 的软校验一致:值变更(防抖)、失焦即校验、聚焦时清除;min/max/step/required 变化后立即重新校验。
标签与图标
label / labelPosition / invisibleLabel 的用法与 TextInput 相同;未显式给 indicator 且 required 为真时,自动回退为 required 指示器。
属性落点
组件根是不可聚焦的 <div>,输入元素是 <input type="number">(包在 oo-ui-numberInputWidget-field 容器里;开启按钮时根元素带 oo-ui-numberInputWidget-buttoned 类)。落点规则与 TextInput 相同:
- props 的
...rest落在根 div 上;要写到原生<input>的属性(如role、aria-*、autoComplete)走inputProps通道,其onChange/onBlur/onFocus串联在组件自身逻辑之后。 inputRef指向内部<input>(组件ref指向根 div),聚焦输入框用inputRef。tabIndex、title、dir、accessKey、name由组件接管,直接落在<input>上(对齐原版落点),不走rest。
API
与原版的差异
step/buttonStep/pageStep传非正值时,原版在构造期直接抛错;本工程开发期告警一次,并按给定值照常渲染。allowInteger/isInteger兼容收编:置位等价于强制step={1},开发期告警提示迁移(原版静默采纳),新代码请直接用step。