开发者问题收集

在 React Hook Forms 7 中两次共享 ref 使用

2021-11-19
3147

我希望我即将将旧的 React Hook 表单转换为 RHF7,但我无法尝试使用两个不同的输入共享两次引用。有人可以帮我完成这段代码吗?所以我需要对 dobMonth 和 dobYear 都使用引用,但我不能两次使用同一个引用,所以我需要创建第二个引用,但它不允许我这样做。

  const dobMonthInput = useRef(null)
  const dobYearInput = useRef(null)

  const {
    register
  } = useForm()

  const { ref, ...rest } = register('dobMonth', {
    required: true,
    validate: (value) => validateDate(value, getValues),
    onChange: (e) => onChange(e),
  })
  /*const { ref, ...rest } = register('dobYear', {
    required: true,
    validate: (value) => validateDate(value, getValues),
    onChange: (e) => onChange(e),
  })*/


  ....



  <input
        name="dobDay"
        type="text"
        {...register('dobDay', {
            required: true,
            validate: (value) => validateDate(value, getValues),
            onChange: (e) => onChange(e),
        })}
  />

  <input
        name="dobMonth"
        type="text"
        {...rest}
        ref={(e) => {
            ref(e)
            dobMonthInput.current = e
        }}
  />
  <input
        name="dobYear"
        type="text"
        {...rest}
        ref={(e) => {
            ref(e)
            dobYearInput.current = e
        }}
  />

我最终需要使用 dobMonthInput.current.focus()dobYearInput.current.focus()

出于显而易见的原因,我收到错误 Identifier 'ref' has already been declared ,但我不知道如何解决它。 谢谢

2个回答

您在分配给同一输入的 React hook refs 之间的 ref 声明方面遇到问题,您需要创建 ref,但不能使用已分配给另一个输入的 ref。

解决问题的技巧如下:

  const dopMReg = register("dobMonth");
  const dopYReg = register("dobYear");

例如:

import React, { useRef } from "react";
import { useForm } from "react-hook-form";

export default function App() {
  const { register, handleSubmit } = useForm();
  const dobMonthInput = useRef(null);
  const dobYearInput = useRef(null);
  const onSubmit = (data) => {
    console.log(data);
    dobMonthInput.current.focus();
  }
  const dopMReg = register("dobMonth");
  const dopYReg = register("dobYear");

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input
        name="dobMonth"
        type="text"
        {...dopMReg}
        ref={(e) => {
          dopMReg.ref(e);
          dobMonthInput.current = e;
        }}
      />
      <input
        name="dobYear"
        type="text"
        {...dopYReg}
        ref={(e) => {
          dopYReg.ref(e);
          dobYearInput.current = e;
        }}
      />
      <button>Submit</button>
    </form>
  );
}

这是 演示网址

Anees Hikmat Abu Hmiad
2021-12-02

您也可以这样使用:

  const dobYearInput = useRef(null)

  const {
    register
  } = useForm()

  const { ref:refDobMonth, ...restDobMonth } = register('dobMonth', {
    required: true,
    validate: (value) => validateDate(value, getValues),
    onChange: (e) => onChange(e),
  })
  const { ref:refDobYear, ...restDobYear } = register('dobYear', {
    required: true,
    validate: (value) => validateDate(value, getValues),
    onChange: (e) => onChange(e),
  })
amirfrd
2021-12-07