Couldn't find a solution.
I'm using react-hook-form
and I want to disable the submit button when the forms are empty and enable as long as all forms have atleast something written in them.
How would I do that using react-hook-form
?

- 441
- 2
- 6
- 8
4 Answers
const {
register,
handleSubmit,
formState: { isSubmitting, isDirty, isValid } // here
} = useForm({ mode: "onChange" })
<button
type="submit"
disabled={!isDirty || !isValid} // here
>
Comment
</button>

- 1,084
- 10
- 14
-
2or you could get form state directly from `const { isDirty, isValid } = useFormState();` if used in nested components – Titenis Nov 25 '21 at 10:09
The best solution I found so far using formState
and by setting the mode to onChange
.
const { register, handleSubmit, formState } = useForm({
mode: "onChange"
});
And on the submit button:
<button disabled={!formState.isValid}/>
Based on this issue: https://github.com/react-hook-form/react-hook-form/issues/77
onChange mode explanation from the documentation:
Validation will trigger on the change event with each input, and lead to multiple re-renders. Warning: this often comes with a significant impact on performance.

- 281
- 3
- 3
you can use formState
=> isDirty
which means form is been modified.
https://react-hook-form.com/api#formState
here is a working example for formState
below:
https://codesandbox.io/s/react-hook-form-v6-formstate-ht098?file=/src/index.jsx:423-432
<input disable={formState.isDirty} type="submit" />

- 17,872
- 19
- 83
- 131
-
What if i want to disabled the submit button again after submit successful. I dont see that case mention the the doc. Thanks for the `react-hook-form` , it is a great lib. – vanduc1102 Aug 30 '23 at 15:54
Close but I think the logic is slightly off from the other comments. The key is to use the &&
operator. Credit to the example with the Formik library.
const { formState: { errors, isDirty, isValid } } = useForm()
///...
<button type="submit" disabled={!isDirty && !isValid}>
Continue
</button>

- 1,653
- 17
- 29
-
So when the form is dirty, yet invalid (false && true), it won't be disabled anymore? I don't think this is a suitable answer for most use cases. – Almog Cohen Oct 09 '22 at 11:16