如何使 react-hook-form 在一页中处理多个表单?

web*_*der 28 javascript reactjs react-hook-form

我在我的项目中使用 react-hook-form 并且我有 2 个完全独立的表单,但是当我提交其中一个表单时,如果需要另一个表单中的某些字段,我无法提交当前表单,请查看演示,并尝试提交其中一个表单,这些表单应该彼此独立工作,但看起来它们相互依赖。

有什么帮助吗?

Fai*_*han 50

欢迎使用 StackOverflow @webcoder 您正在为两种表单使用相同的钩子实例。您将不得不使用不同的名称重复使用。

import React from "react";
import ReactDOM from "react-dom";
import { useForm } from "react-hook-form";

import "./styles.css";

function App() {
  const {
    register,
    formState: { errors },
    handleSubmit,
  } = useForm({
    mode: "onBlur",
  });

  const {
    register: register2,
    formState: { errors: errors2 },
    handleSubmit: handleSubmit2,
  } = useForm({
    mode: "onBlur",
  });

  const onSubmit = (data) => {
    alert(JSON.stringify(data));
  };

  const onSubmitEmail = (data) => {
    alert(JSON.stringify(data));
  };

  return (
    <div className="App">
      <form key={1} onSubmit={handleSubmit(onSubmit)}>
        <div>
          <label htmlFor="firstName">First Name</label>
          <input
            name="firstName"
            placeholder="bill"
            ref={register({ required: true })}
          />
          {errors.firstName && <p>This is required</p>}
        </div>

        <div>
          <label htmlFor="lastName">Last Name</label>
          <input
            name="lastName"
            placeholder="luo"
            ref={register({ required: true })}
          />
          {errors.lastName && <p>This is required</p>}
        </div>
        <input type="submit" />
      </form>

      <form key={2} onSubmit={handleSubmit2(onSubmitEmail)}>
        <div>
          <label htmlFor="email" placeholder="bluebill1049@hotmail.com">
            Email
          </label>
          <input name="email" ref={register2({ required: true })} />
          {errors2.email && <p>This is required</p>}
        </div>
        <input type="submit" />
      </form>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案,也很友善的问候。 (7认同)
  • 我们在表单标签中需要这些吗?`key={1}` 和 `key={2}`??? (3认同)
  • 你注意到了吗 ?评论的家伙@bill 是 react 使用表单的创建者。 (2认同)
  • @Eddysapata LOL 我没有,我以为是问这个问题的人。比尔在包装上取得了很好的成功。这确实是一部了不起的作品。 (2认同)

cri*_*n24 11

快速更新 Faizaan 的答案:就我而言,errors应该与 一起使用formState,而不是单独使用。因此,该属性应导入为:

const { formState: { errors } } = useForm();
const { formState: { errors: errors2 } } = useForm();
Run Code Online (Sandbox Code Playgroud)

这些名称可能会令人困惑,但这是我得出的解决方案。

  • 是否可以在一个页面上动态创建多个表单?这硬编码了2种形式?我们可以动态创建并在页面上呈现的react-hook-forms列表吗? (10认同)
  • @benJephunneh我不记得我是怎么做到的,也是React.js的新手...在react中,只需考虑组件,因此创建一个具有1个表单的新组件,然后渲染多个组件.. (2认同)