InputOTP
用于验证码、一次性密码和分段短码输入的 OTP 输入组件
InputOTP 用于输入固定长度的一次性密码、短信验证码、邮箱验证码或短码。组件基于 input-otp 封装,默认渲染 6 个输入槽,并提供分隔符、掩码、受控值和完成回调。
import {
InputOTP,
InputOTPGroup,
InputOTPSeparator,
InputOTPSlot,
InputOtpRoot
} from '@skyroc/web-ui';何时使用
- 需要输入固定长度验证码、一次性密码或短码。
- 输入内容需要按位展示,并在填满后触发完成逻辑。
- 需要支持粘贴完整验证码、自动补全或密码管理器兼容策略。
- 普通单行文本输入使用 Input;数字步进输入使用 NumberInput。
基础用法
默认渲染 6 个输入槽。通过 onComplete 可以在输入填满后触发业务逻辑。
自定义长度
通过 inputCount 控制输入槽数量。组件会把该值作为底层 maxLength。
受控值
通过 value 和 onChange 控制输入值,可以在回调中对输入内容做转换。
分隔符
通过 separator 开启分隔展示。传入 true 时使用默认 Minus 图标;如果需要自定义分隔符,请传入 React element。
密码模式
通过 mask 将已输入字符显示为圆点,适合验证码或一次性密码等敏感输入。
禁用
通过 disabled 禁用底层输入能力。
尺寸
通过 size 调整每个输入槽的宽高、字号和分隔符字号,从 xs 到 2xl 共 6 个尺寸。
| 尺寸 | 槽尺寸 | 字号 | 适用场景 |
|---|---|---|---|
xs | 24px | 10px | 紧凑表单、表格内嵌 |
sm | 28px | 12px | 辅助验证流程 |
md | 32px | 14px | 常规场景(默认) |
lg | 36px | 16px | 重点验证区域 |
xl | 40px | 18px | 大号验证输入 |
2xl | 48px | 20px | 首屏或强引导流程 |
自定义样式
通过 classNames 控制不同 slot:root、group、input 和 separator。也可以通过 groupProps、slotProps、separatorProps 分别向内部结构组件传入额外属性。
API
InputOTP
通用属性参考:封装 InputOtpRoot、InputOTPGroup、InputOTPSlot 和 InputOTPSeparator 的便捷组件。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| value | 受控 OTP 值 | string | - |
| defaultValue | 非受控模式下的默认 OTP 值 | string | - |
| onChange | OTP 值变化时触发 | (value: string) => void | - |
| onComplete | 输入槽全部填满时触发 | function | - |
| inputCount | 输入槽数量,同时作为底层 maxLength | number | 6 |
| mask | 是否用圆点隐藏已输入字符 | boolean | false |
| separator | 是否显示分隔符;true 使用默认 Minus 图标,自定义内容建议传 React element | ReactNode | true | - |
| size | 尺寸,影响输入槽宽高、字号和分隔符字号 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'md' |
| placeholder | 空槽位的占位字符 | string | - |
| disabled | 是否禁用输入 | boolean | - |
| inputMode | 移动端输入键盘类型 | string | - |
| type | 底层 input 类型,例如 password | string | - |
| pasteTransformer | 粘贴内容转换函数,用于清理空格、短横线等格式 | (pasted: string) => string | - |
| pushPasswordManagerStrategy | 密码管理器兼容策略 | 'increase-width' | 'none' | - |
| textAlign | 输入文本对齐方式 | 'center' | 'left' | 'right' | - |
| className | 传递给根节点的自定义 class | ClassValue | - |
| classNames | 各 slot 的自定义 class(root / group / input / separator) | InputOTPClassNames | - |
| groupProps | 传递给 InputOTPGroup 的额外 props | InputOTPGroupProps | - |
| slotProps | 传递给每个 InputOTPSlot 的额外 props | InputOTPSlotProps | - |
| separatorProps | 传递给 InputOTPSeparator 的额外 props | InputOTPSeparatorProps | - |
结构组件
当需要完全自定义 OTP 结构时,可以直接组合底层结构组件。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| InputOtpRoot | 根输入组件,基于 input-otp 的 OTPInput | InputOTPRootProps | - |
| InputOTPGroup | 输入槽容器,负责排列多个 slot | InputOTPGroupProps | - |
| InputOTPSlot | 单个输入槽,必须提供 index | InputOTPSlotProps | - |
| InputOTPSeparator | 分隔符容器,默认显示 Minus 图标 | InputOTPSeparatorProps | - |
类型
InputOTPProps
主组件属性。基于 input-otp 根输入属性,移除 maxLength,并通过 inputCount 自动生成输入槽。
| 字段 | 类型 | 说明 |
|---|---|---|
| className | ClassValue | 根节点 class。 |
| classNames | InputOTPClassNames | 各 slot 的自定义 class。 |
| defaultValue | string | 非受控默认值。 |
| disabled | boolean | 是否禁用。 |
| groupProps | InputOTPGroupProps | 传递给分组容器的属性。 |
| inputCount | number | 输入槽数量。默认值为 6。 |
| inputMode | string | 移动端输入键盘类型。 |
| mask | boolean | 是否隐藏槽位字符。默认值为 false。 |
| onChange | (value: string) => void | 输入值变化回调。 |
| onComplete | function | 输入完成回调。 |
| pasteTransformer | (pasted: string) => string | 粘贴内容转换函数。 |
| placeholder | string | 空槽位占位字符。 |
| pushPasswordManagerStrategy | 'increase-width' | 'none' | 密码管理器兼容策略。 |
| separator | ReactNode | true | 分隔符配置。true 使用默认 Minus 图标。 |
| separatorProps | InputOTPSeparatorProps | 传递给分隔符的属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 组件尺寸。 |
| slotProps | InputOTPSlotProps | 传递给每个输入槽的属性。 |
| textAlign | 'center' | 'left' | 'right' | 输入文本对齐方式。 |
| type | string | 底层 input 类型。 |
| value | string | 受控输入值。 |
InputOTPClassNames
各 slot 的自定义 class,用于精细化控制 InputOTP 各部分的样式。
| 字段 | 类型 | 说明 |
|---|---|---|
| root | ClassValue | 根节点 class。 |
| group | ClassValue | 输入槽分组容器 class。 |
| input | ClassValue | 输入槽 class。 |
| separator | ClassValue | 分隔符 class。 |
InputOTPRootProps
根输入属性。基于 input-otp 的 OTPInput,支持 children 组合或 render 函数二选一。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 自定义结构子节点。与 render 二选一。 |
| className | ClassValue | 根节点 class。 |
| containerClassName | string | 底层容器 class。 |
| maxLength* | number | 最大输入长度。 |
| onChange | (value: string) => void | 输入值变化回调。 |
| onComplete | function | 输入完成回调。 |
| pasteTransformer | (pasted: string) => string | 粘贴内容转换函数。 |
| pushPasswordManagerStrategy | 'increase-width' | 'none' | 密码管理器兼容策略。 |
| render | InputOTPRenderFn | 自定义渲染函数。与 children 二选一。 |
| textAlign | 'center' | 'left' | 'right' | 输入文本对齐方式。 |
| value | string | 受控输入值。 |
InputOTPGroupProps
输入槽分组容器属性。继承 div 元素属性,并支持 separate 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 输入槽和分隔符内容。 |
| className | ClassValue | 分组容器 class。 |
| separate | boolean | 是否让输入槽分离展示。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 组件尺寸。 |
InputOTPSlotProps
单个输入槽属性。通过 index 从 InputOTP 上下文中读取对应槽位状态。
| 字段 | 类型 | 说明 |
|---|---|---|
| className | ClassValue | 输入槽 class。 |
| index* | number | 槽位索引,从 0 开始。 |
| mask | boolean | 是否隐藏当前槽位字符。 |
| separate | boolean | 是否按分离样式显示。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 组件尺寸。 |
InputOTPSeparatorProps
分隔符容器属性。继承 div 元素属性。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 自定义分隔符。当前只有 React element 会替换默认 Minus 图标。 |
| className | ClassValue | 分隔符 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 组件尺寸。 |
InputOTPSlots
InputOTP 可配置 classNames 的内置 slot
InputOTPRenderFn
InputOtpRoot 的自定义渲染函数