ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

shadcn-vue Input OTP 组件实战指南:从安装到表单集成的可访问一次性密码输入

shadcn-vue Input OTP 组件实战指南:从安装到表单集成的可访问一次性密码输入 UI组件前端【免费下载链接】shadcn-vueVue port of shadcn-ui项目地址https://gitcode.com/gh_mirrors/sh/shadcn-vue点击查看免费下载本文围绕 shadcn-vue 官方文档 Input OTP 组件文档 展开系统讲解基于vue-input-otp封装的一次性密码输入组件的完整用法。你将掌握 CLI/手动两种安装方式、四个子组件的组合规则、pattern自定义输入模式、v-model受控用法以及如何与 VeeValidate 集成实现带校验的验证码表单并深入理解其底层实现原理与可访问性设计。组件概览四个子组件如何协作Input OTP 不是单个组件而是一个由四个子组件组合而成的组件族它们各司其职组件职责关键 PropsInputOTP根组件承载整体输入逻辑值管理、焦点、粘贴处理maxlength、pattern、v-model、classInputOTPGroup将多个输入槽位分组控制组内水平排列classInputOTPSlot单个字符槽位负责渲染字符、激活态与假光标index、classInputOTPSeparator在分组之间插入分隔符默认渲染减号图标class从源码结构看根组件 InputOTP.vue 直接转发vue-input-otp的OTPInputProps与OTPInputEmits并通过 reka-ui 的useForwardPropsEmits做属性/事件转发同时将class单独剥离后拼接到容器类上const props definePropsOTPInputProps { class?: HTMLAttributes[class] }() const emits defineEmitsOTPInputEmits() const delegatedProps reactiveOmit(props, class) const forwarded useForwardPropsEmits(delegatedProps, emits)而 InputOTPSlot.vue 通过useVueOTPContext()获取 OTP 上下文依据传入的index读取对应槽位的状态slot?.char、slot?.isActive、slot?.hasFakeCaret并据此渲染字符、激活态边框和闪烁的光标动画animate-caret-blink。安装CLI 与手动两种方式方式一CLI 一键安装推荐在项目根目录执行npx shadcn-vuelatest add input-otp该命令会自动将组件源码写入项目的components/ui/input-otp目录并同步安装所需依赖。关于 CLI 的更多用法如 registry 指定、覆盖策略等可参考仓库中的 CLI 文档。方式二手动安装安装底层依赖本组件基于vue-input-otp封装需要先安装它npm install vue-input-otp同时确保项目中已具备 reka-ui用于useForwardProps/useForwardPropsEmits、vueuse/core用于reactiveOmit以及lucide/vue用于分隔符图标等运行时依赖。复制源码从仓库中复制 Input OTP 组件族的四个源文件到你的项目中对应源码位于InputOTP.vueInputOTPGroup.vueInputOTPSlot.vueInputOTPSeparator.vue修正导入路径将源码中的/lib/utilscn工具函数、/registry/new-york-v4/ui/input-otp等导入路径改为与你项目结构一致的相对路径。基本用法六位验证码最典型的使用方式是分组渲染槽位InputOTP通过maxlength决定总位数InputOTPGroup负责将槽位分组组间可插入分隔符script setup langts import { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, } from /components/ui/input-otp /script template InputOTP v-modelvalue :maxlength6 InputOTPGroup InputOTPSlot :index0 / InputOTPSlot :index1 / InputOTPSlot :index2 / /InputOTPGroup InputOTPSeparator / InputOTPGroup InputOTPSlot :index3 / InputOTPSlot :index4 / InputOTPSlot :index5 / /InputOTPGroup /InputOTP /template要点说明maxlength与槽位数需一致maxlength6表示验证码长度为 6因此渲染了 6 个InputOTPSlotindex从 0 到 5。index必须唯一且连续每个槽位通过index关联到底层 OTP 上下文中的对应位置重复或跳号会导致输入错位。v-model双向绑定绑定值即用户最终输入的验证码字符串提交表单时直接读取即可。完整的可运行示例可参考 InputOTPDemo.vue。高级用法一自定义输入模式pattern默认情况下槽位接受任意字符。当业务要求限制字符类型如只允许数字、或数字字母时可通过pattern属性传入正则。vue-input-otp内置了常用正则常量例如REGEXP_ONLY_DIGITS_AND_CHARS仅数字和字母script setup langts import { REGEXP_ONLY_DIGITS_AND_CHARS } from vue-input-otp // ... /script template InputOTP maxlength6 :patternREGEXP_ONLY_DIGITS_AND_CHARS InputOTPGroup InputOTPSlot :index0 / !-- ... -- /InputOTPGroup /InputOTP /template从底层实现看pattern会透传到vue-input-otp的OTPInput组件由它在输入阶段对每个字符做正则校验不符合规则的按键会被拦截从而在源头保证输入合法性。你也可以传入自定义正则如/^[0-9]$/实现更严格的纯数字限制。对应演示见 InputOTPPatternDemo.vue。高级用法二分组与分隔符Separator当验证码位数较多时通常按3-3或4-4分组以提升可读性。使用InputOTPSeparator /在组间插入分隔元素template InputOTP maxlength4 InputOTPGroup InputOTPSlot :index0 / InputOTPSlot :index1 / /InputOTPGroup InputOTPSeparator / InputOTPGroup InputOTPSlot :index2 / InputOTPSlot :index3 / /InputOTPGroup /InputOTP /template从源码看InputOTPSeparator.vue 渲染一个带roleseparator的容器默认通过MinusIcon来自lucide/vue展示减号分隔符你也可以通过默认插槽传入自定义分隔内容如/或-文本。完整演示见 InputOTPSeparatorDemo.vue。高级用法三受控组件v-modelInputOTP支持标准的v-model指令你可以完全掌控输入值例如在值变化时触发校验、联动「重发验证码」倒计时或实现「输入满 6 位自动提交」等交互script setup langts import { ref, watch } from vue const value ref() watch(value, (v) { if (v.length 6) { // 自动提交验证码 } }) /script对应演示见 InputOTPControlledDemo.vue。高级用法四接入表单校验VeeValidateInput OTP 可以无缝嵌入表单校验体系。官方文档以 VeeValidate 为例通过VeeField包裹输入将componentField透传给InputOTP配合 Zod schema 实现「最少 6 位」等校验规则错误信息通过FieldError展示script setup langts import { toTypedSchema } from vee-validate/zod import { useForm, Field as VeeField } from vee-validate import { z } from zod const formSchema toTypedSchema( z.object({ pin: z.string().min(6, { message: Your one-time password must be 6 characters., }), }), ) const { handleSubmit, submitCount } useForm({ validationSchema: formSchema, initialValues: { pin: }, }) const onSubmit handleSubmit((data) { // 提交 data.pin }) /script template form classspace-y-6 w-sm submitonSubmit VeeField v-slot{ componentField, errors } namepin :validate-on-blurfalse :validate-on-inputsubmitCount 0 :validate-on-model-updatesubmitCount 0 Field :data-invalid!!errors.length FieldLabel forform-otp-demo-pin One-Time Password /FieldLabel InputOTP idform-otp-demo-pin v-bindcomponentField :maxlength6 :aria-invalid!!errors.length InputOTPGroup InputOTPSlot :index0 / InputOTPSlot :index1 / InputOTPSlot :index2 / InputOTPSlot :index3 / InputOTPSlot :index4 / InputOTPSlot :index5 / /InputOTPGroup /InputOTP FieldDescription Please enter the one-time password sent to your phone. /FieldDescription FieldError v-iferrors.length :errorserrors / /Field /VeeField Button typesubmit formform-otp-demo Submit /Button /form /template实现细节值得注意校验时机validate-on-blurfalse关闭失焦校验配合validate-on-input与validate-on-model-update在submitCount 0即首次提交后才开启实时校验避免用户未输入就报错这是表单体验设计的常见模式。无障碍联动:aria-invalid!!errors.length将校验状态同步到 ARIA 属性配合InputOTPSlot中aria-invalid相关的错误态样式红色边框让屏幕阅读器与视觉提示保持一致。错误展示FieldError仅在存在错误时渲染错误消息与FieldDescription正常提示文案互不干扰。完整的表单集成示例见 InputOTPFormDemo.vue它使用了仓库中同目录下的 Field 组件族 与 Button 组件。可访问性与交互细节源码层面的实现Input OTP 的价值不仅在于视觉更在于「复制粘贴可用、键盘可操作、屏幕阅读器可感知」。这些能力大多由底层vue-input-otp提供并由 shadcn-vue 的封装层以样式和语义完整承接粘贴支持底层OTPInput默认支持将整串验证码一次性粘贴并自动分配到各槽位无需逐位手动输入。自动前进/回退输入一位后焦点自动移到下一位退格时空位会自动回到前一位。假光标Fake Caret在空槽位中渲染一个闪烁的竖线光标见 InputOTPSlot.vue 中基于slot?.hasFakeCaret渲染的animate-caret-blink元素让用户明确感知当前输入位置。激活态样式当前激活槽位通过data-active属性驱动高亮data-[activetrue]:border-ring、data-[activetrue]:ring-3等禁用状态通过has-disabled:opacity-50统一降透明度。语义化角色分隔符带roleseparator根容器带data-slotinput-otp便于开发者与测试工具精确定位。如果你需要完全定制视觉风格可以直接修改槽位的 Tailwind 类如调整h-9 w-9的尺寸、圆角rounded-l-md/rounded-r-md的分组首尾处理分组与分隔逻辑保持不变即可。小结shadcn-vue 的 Input OTP 组件以vue-input-otp为内核通过InputOTP/InputOTPGroup/InputOTPSlot/InputOTPSeparator四个子组件提供了声明式、可组合、可访问的验证码输入方案。无论是简单的六位数字验证码还是带分隔符、自定义字符模式、实时校验的复杂表单场景都可以用本文介绍的方式快速落地。官方文档入口位于 Input OTP 文档源码与演示分别位于 registry/new-york-v4/ui/input-otp 与 components/demo。赞分享UI组件前端【免费下载链接】shadcn-vueVue port of shadcn-ui项目地址https://gitcode.com/gh_mirrors/sh/shadcn-vue点击查看免费下载相关推荐shadcn-svelte Input OTP 组件指南基于 Bits UI PinInput 的可访问一次性密码输入shadcn svelte Input OTP 组件指南基于 Bits UI PinInput 的可访问一次性密码输入 导读 Input OTP 是 shadUI组件前端CLI开发工具shadcn-vue PIN Input 组件完全指南从安装到表单集成的实战详解shadcn vue PIN Input 组件完全指南从安装到表单集成的实战详解 PIN Input 是 shadcn vue 中用于输入一序列单字符字母或UI组件前端Vuetify VOtpInput 组件深度指南用 v-otp-input 构建 MFA 一次性密码输入Vuetify VOtpInput 组件深度指南用 v otp input 构建 MFA 一次性密码输入 本指南围绕 Vuetify 的 VOtpInput前端UI组件上一篇Linux 内核 ARM 平台移植指南解压器与内核符号地址约定详解下一篇9Router 配额跟踪与用量监控实战指南实时追踪 Token 消耗、成本估算与告警机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表