当 React-Select 改变时,React-hook-form 不会改变表单有效性

React-hook-form doesn't change the form validity when React-Select is changed

我有一个 react-hook-form 和 react-select:

我几乎什么都试过了:用setValue("name", value, {shouldDirty: true}替换onChange,等等

代码如下:

import { useForm, Controller } from "react-hook-form";
import Select from "react-select";

const options = [
  { value: "joe", label: "Joe" },
  { value: "jack", label: "Jack" },
  { value: "averell", label: "Averell" }
];

type Data = { name: string; surname: string };
export default function Form({
  defaultValues,
  onSend
}: {
  defaultValues: Data;
  onSend: (data: Data) => void;
}) {
  const {
    register,
    handleSubmit,
    reset,
    getValues,
    control,
    formState: { isValid, isDirty }
  } = useForm({
    mode: "onChange",
    defaultValues
  });

  const onSubmit = (data: Data) => {
    onSend(data);
    reset(getValues());
    console.log("data sent!", data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
     
        <Controller
          control={control}
          name="name"
          render={({ field }) => (
            <Select
            {...field}
              value={field.value}
              options={options}
              onChange={(v) => field.onChange(v)}
            />
          )}
        />
      <input placeholder="surname" {...register("surname")}/>
    
     
        <button type="submit" disabled={!isValid || !isDirty}>
          submit
        </button>

    </form>
  );
}

如何解决这个问题?

ps:这里也是一个沙箱:https://codesandbox.io/s/react-hook-form-test-8tdq3?file=/src/FormController.tsx

所以答案是我需要添加一个useEffect来在提交后重置表单值:

useEffect(() => {
    if (formState.isSubmitSuccessful) {
      reset(getValues());
    }
  }, [formState, getValues, reset]);