useFormconst form = useForm({ initialValues })Creates a new form and returns a form object.
We can also pass initial values to the form using:
const form = useForm({ initialValues: { name: 'John' } })Note: By default, whenever initialValues changes, the form is reset to the new initialValues.
So, in the above snippet, if the component using useForm re-renders, a new object is created, causing the
previous initialValues and the new initialValues to be different. This will reset the form.
To avoid this, create the initialValues in an useRef:
const initialValues = useRef({ name: 'John' })
const form = useForm({ initialValues: initialValues.current })Using this hook does not cause the component hosting it to re-render on state changes.
useFormStateconst formState = useFormState(form, mapState?)
const { anyError, anyTouched, anyDirty, values } = formStateAccepts a form object (the value returned by useForm hook)
and returns the current form state.
The values in formState object are:
anyError - true if any of the fields has an error.anyTouched - true if any of the fields is touched.anyDirty - true if any of the fields has been modified after the form is initialized.values - current values of the form.When a field is updated, this hook will trigger a re-render if any of the above values changes.
useFormState hook also accepts a second argument mapState which is a function which allows to
return a derived state and also control the state changes for which the form should re-render
(similar to redux's mapStateToProps).
For example, if mapState is specified as state => ({ anyError: state.anyError }),
it will causes re-render only when anyError value changes.
To determine if a re-render should be performed,
previous return value of mapState function is compared with the new value.
useFieldStateconst fieldState = useFieldState(form, id, mapState?, { validate }?)
const { error, touched, dirty, value } = fieldStateAccepts a form object (the value returned by useForm hook)
and a field id and returns the current field state.
The values in fieldState object are:
error - error returned by validate function.touched - true if the field is touched.dirty - true if the field has been modified.value - current value of the field.When the field is updated, this hook will trigger a re-render if any of the above values changes.
Similar to useFormState hook, useFieldState hook also accepts a third argument mapState,
which is a function which allows to return a derived state and also control the state changes for which the form should re-render
(similar to redux's mapStateToProps).
For example, if mapState is specified as state => ({ value: state.value }),
it will causes re-render only when value changes. In this example, if a field is touched, it won't cause a re-render.
To determine if a re-render should be performed,
previous return value of mapState function is compared with the new value.
The fourth argument to useFieldState hook is used to specify any extra options for the field.
Currently, it accepts a validate function. validate function specified should take field value as argument and
it should return an error string if there is an error or should return a null/false/empty string value if there is no error.
form objectform object returned by useForm hook has two objects described below.
const { formActions, fieldActions } = formformActionsFunctions in formActions object are used to manipulate the form state.
resetFormValuesformActions.resetFormValues(newInitialState?)Resets the form values to initial state.
If newInitialState argument is specified, old initialState is replaced with newInitialState.
So that next time resetFormValues is called without an argument, the form is reset to the newInitialState.
submitHandlerformActions.submitHandler(submitFn)Accepts the function to be called when submitting the form.
The return value submitHandler function can be used to pass to form onSubmit prop.
Form is not submitted if the form is invalid (i.e., it has some errors).
If the form has any errors, it sets all fields to touched state.
getFormStateconst formState = formActions.getFormState()Returns the current state of the form. Same return values as useFormState hook.
fieldActionsFunctions in fieldActions object are used to manipulate field states.
changeFieldValuechangeFieldValue(fieldId, value)Change field value. Changes field value and sets dirty to true.
touchFieldtouchField(fieldId)Set field state to touched.
getFieldStategetFieldState(fieldId)Returns the current state of the field. Same return values as useFieldState hook.