You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Formik Field中实现4位验证码输入框自动切换?

实现Formik Field验证码输入自动切换输入框

完全可以通过Formik Field实现自动切换功能,核心思路是在输入框的变更事件里判断内容长度,自动聚焦到下一个/上一个输入框,不需要依赖第三方库。结合你的Next.js+React技术栈,直接改造现有代码即可:

1. 改造自定义输入组件(CustomInput)

给组件添加事件逻辑,处理输入后的聚焦切换,同时保留Formik的表单状态同步:

import { forwardRef } from 'react';

// 用forwardRef传递输入框的DOM引用
const CustomInput = forwardRef(({ field, index, inputRef, ...props }, ref) => {
  const handleInputChange = (e) => {
    // 先触发Formik的onChange更新表单值
    field.onChange(e);
    const { value } = e.target;

    // 输入1位内容后,自动聚焦下一个输入框(4位验证码,索引0-3)
    if (value.length === 1 && index < 3) {
      inputRef.current[index + 1]?.focus();
    }
    // 删除内容后,自动聚焦上一个输入框
    if (value.length === 0 && index > 0) {
      inputRef.current[index - 1]?.focus();
    }
  };

  return (
    <input
      ref={(el) => {
        ref(el);
        // 将当前输入框DOM存入父组件的ref数组
        inputRef.current[index] = el;
      }}
      {...field}
      {...props}
      onChange={handleInputChange}
      maxLength={1} // 限制每个输入框只能输入1位
    />
  );
});

export default CustomInput;

2. 调整Formik组件中的Field调用

在Formik里创建存储所有输入框引用的数组,传递给每个Field组件:

<Formik
  initialValues={{ code: ['', '', '', ''] }} // 初始化4位空验证码数组
  onSubmit={values =>
    VerifyGarageFunc({ code: values.code.join(''), requestId: PhoneCodeData.data }, data.showModal)
  }>
  {({ values, handleSubmit }) => {
    // 创建ref数组存储所有输入框DOM
    const inputRefs = useRef([]);

    return (
      <form onSubmit={handleSubmit}>
        <FieldArray
          name="code"
          render={arrayHelpers => (
            <div className={styles.inputWrapper}>
              {values.code.map((item, index) => (
                <div key={index}>
                  <Field
                    name={`code.${index}`}
                    type="text"
                    component={CustomInput}
                    index={index} // 传递当前输入框索引
                    inputRef={inputRefs} // 传递ref数组
                  />
                </div>
              ))}
            </div>
          )}
        />
        <LoginActionButton onSubmit={handleSubmit} text={'Send'} />
      </form>
    );
  }}
</Formik>

关键说明

  • 用maxLength={1}强制每个输入框只能输入1位字符,确保切换逻辑触发条件准确;
  • 通过useRef数组存储所有输入框DOM,避免直接查询DOM,符合React最佳实践;
  • 保留Formik原生的field.onChange,确保表单状态能正常同步到Formik的values中。

内容的提问来源于stack exchange,提问作者user18150656

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:57:11