Controller: Component
React Hook Form embraces uncontrolled components and native inputs, however it's hard to avoid working with external controlled component such as React-Select, AntD and Material-UI. This wrapper component will make it easier for you to work with them.
Props
The following table contains information about the arguments for useController
.
Name | Type | Required | Description |
---|---|---|---|
name | FieldPath | ✓ | Unique name of your input. |
control | Control | control object is from invoking useForm . Optional when using FormProvider . | |
render | Function | This is a render prop. A function that returns a React element and provides the ability to attach events and value into the component. This simplifies integrating with external controlled components with non-standard prop names. Provides
| |
defaultValue | unknown | Important: Can not apply
| |
rules | Object | Validation rules in the same format for required, min, max, minLength, maxLength, pattern, validate
| |
shouldUnregister | boolean = false | Input will be unregistered after unmount and defaultValues will be removed as well. |
Return
The following table contains information about properties which Controller
produces.
Object Name | Name | Type | Description |
---|---|---|---|
field | onChange | (value: any) => void | A function which sends the input's value to the library. |
onBlur | () => void | A function which sends the input's onBlur event to the library. It should be assigned to the input's | |
value | unknown | The current value of the controlled component. | |
name | |||
Input's name being registered. | |||
ref | |||
A ref used to connect hook form to the input. Assign | |||
fieldState | invalid | boolean | Invalid state for current input. |
isTouched | boolean | Touched state for current controlled input. | |
isDirty | boolean | Dirty state for current controlled input. | |
error | object | error for this specific input. | |
formState | 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 Dirty fields will not represent as | |
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 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. |
Examples
import React from "react";
import ReactDatePicker from "react-datepicker";
import { TextField } from "@material-ui/core";
import { useForm, Controller } from "react-hook-form";
function App() {
const { handleSubmit, control } = useForm();
return (
<form onSubmit={handleSubmit(data => console.log(data))}>
<Controller
control={control}
name="ReactDatepicker"
render={({ field: { onChange, onBlur, value, ref } }) => (
<ReactDatePicker
onChange={onChange}
onBlur={onBlur}
selected={value}
/>
)}
/>
<input type="submit" />
</form>
);
}
Video
The following video showcase what's inside Controller and how its been build.
Tips
Do not
register
input again. This component is made to take care of the registration process.<Controller name="test" render={({ field }) => { // return <input {...field} {...register('test')} />; ❌ double up the registration return <input {...field} />; // ✅ }} />
Customise what value gets sent to hook form by transforming the value during
onChange
.<Controller name="test" render={({ field }) => { // sending integer instead of string. return <input {...field} onChange={(e) => field.onChange(parseInt(e.target.value))} />; }} />
Thank you for your support
If you find React Hook Form to be useful in your project, please consider to star and support it.