formState: Object
This object contains information about the form state. If you want to subscribe to formState
via useEffect
, make sure that you place the entire formState
in the optional array.
Rules
formState
is wrapped with a Proxy to improve render performance and skip extra logic if specific state is not subscribed to. Therefore make sure you invoke or read it before a render
in order to enable the state update. This reduced re-render feature only applies to the Web platform due to a lack of support for Proxy in React Native.
useEffect(() => { if (formState.errors.firstName) { // do the your logic here } }, [formState]); // ✅ // ❌ formState.errors will not trigger the useEffect
// ❌ formState.isValid is accessed conditionally, // so the Proxy does not subscribe to changes of that state return <button disabled={!formState.isDirty || !formState.isValid} />; // ✅ read all formState values to subscribe to changes const { isDirty, isValid } = formState; return <button disabled={!isDirty || !isValid} />;
Return
Name | Type | Description |
---|---|---|
isDirty | boolean | Set to
|
dirtyFields | object | An object with the user-modified fields. Make sure to provide all inputs' defaultValues via useForm, so the library can compare against the |
touchedFields | object | An object containing all the inputs the user has interacted with. |
isSubmitted | boolean | Set to true after the form is submitted. Will remain true until the reset method is invoked. |
isSubmitSuccessful | boolean | Indicate the form was successfully submitted without any |
isSubmitting | boolean | true if the form is currently being submitted. false if otherwise. |
submitCount | number | Number of times the form was submitted. |
isValid | boolean | Set to true if the form doesn't have any errors.Note: |
isValidating | boolean | Set to true during validation. |
errors | object | An object with field errors. There is also an ErrorMessage component to retrieve error message easily. |
import React from "react"; import { useForm } from "react-hook-form"; export default function App() { const { register, handleSubmit, // Read the formState before render to subscribe the form state through the Proxy formState: { errors, isDirty, isSubmitting, touchedFields, submitCount }, } = useForm(); const onSubmit = (data: FormInputs) => console.log(data); return ( <form onSubmit={handleSubmit(onSubmit)}> <input {...register("test")} /> <input type="submit" /> </form> ); }
import React from "react"; import { useForm } from "react-hook-form"; type FormInputs = { test: string } export default function App() { const { register, handleSubmit, // Read the formState before render to subscribe the form state through Proxy formState: { errors, isDirty, isSubmitting, touchedFields, submitCount }, } = useForm<FormInputs>(); const onSubmit = (data: FormInputs) => console.log(data); return ( <form onSubmit={handleSubmit(onSubmit)}> <input {...register("test")} /> <input type="submit" /> </form> ); }