反应钩子表单更改时未触发 useEffect

use*_*932 2 reactjs react-hooks use-effect react-hook-form

希望使用带有 useEffect 的 React hook 表单来实时获取更改(当用户填写表单时),是否有一个原因导致 useEffect 在这里不被触发,如果是这样,有没有办法在表单数据时触发它变化?这里的示例来自https://remotestack.io/react-hook-form-set-update-form-values-with-useeffect-hook/

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

export default function SimpleForm() {
  const { register, handleSubmit, reset, formState } = useForm();

  const [student, initStudent] = useState(null);

  useEffect(() => {
    setTimeout(
      () =>
        initStudent({
          name: "Little Johnny",
          email: "lil@johnny.com",
          grade: "3rd",
        }),
      1200
    );
  }, []);

  useEffect(() => {
    console.log("updating.,..");

    reset(student);
  }, [reset, student]);

  function onFormSubmit(dataRes) {
    console.log(dataRes);
    return false;
  }

  return (
    <div>
      <h2 className="mb-3">
        React Initiate Form Values in useEffect Hook Example
      </h2>

      {student && (
        <form onSubmit={handleSubmit(onFormSubmit)}>
          <div className="form-group mb-3">
            <label>Name</label>
            <input
              type="text"
              name="name"
              {...register("name")}
              className="form-control"
            />
          </div>

          <div className="form-group mb-3">
            <label>Email</label>
            <input
              type="email"
              name="email"
              {...register("email")}
              className="form-control"
            />
          </div>

          <div className="form-group mb-3">
            <label>Grade</label>
            <input
              type="text"
              name="grade"
              {...register("grade")}
              className="form-control"
            />
          </div>

          <button type="submit" className="btn btn-dark">
            Send
          </button>
        </form>
      )}
      {!student && (
        <div className="text-center p-3">
          <span className="spinner-border spinner-border-sm align-center"></span>
        </div>
      )}
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

小智 14

您可以使用watch反应钩子形式的模式来获取每个更改。

const { register, handleSubmit, reset, formState, watch } = useForm();


useEffect(() => {
    watch((value, { name, type }) => console.log(value, name, type));
 }, [watch]);
Run Code Online (Sandbox Code Playgroud)

在此处阅读有关观看模式表单的更多信息