useController:
(props?: UseControllerProps) => { field: object, fieldState: object, formState: object }
이 커스텀 훅은 Controller
를 구동합니다. 또한 Controller
와 동일한 props와 메서드를 공유합니다. 재사용 가능한 제어 입력 필드를 만드는데 유용합니다.
Props
다음 표는 useController
의 인자에 대한 정보를 담고 있습니다.
Name | Type | Required | Description |
---|---|---|---|
name | FieldPath | ✓ | 입력 필드의 고유한 이름. |
control | Control | useForm 을 호출하여 제공된 control 객체. FormProvider 을 사용할 때에는 선택사항. | |
defaultValue | unknown | 중요:
| |
rules | Object |
required, min, max, minLength, maxLength, pattern, validate
| |
shouldUnregister | boolean = false | 입력 필드가 언마운트된 후에는 등록이 해제(unregistered)되며 기본값도 제거됩니다. 참고: 이 prop는 | |
disabled | boolean = false |
|
Return
다음 표는 useController
가 제공하는 프로퍼티에 대한 정보를 포함하고 있습니다.
Object Name | Name | Type | Description |
---|---|---|---|
field | onChange | (value: any) => void | 입력값을 라이브러리에 전달하는 함수. |
field | onBlur | () => void | 입력 필드의 onBlur 이벤트를 라이브러리로 전달하는 함수입니다. 이 함수는 입력 필드의 |
field | value | unknown | 제어 컴포넌트의 현재 값. |
field | disabled | boolean | 입력 필드의 비활성화 상태. |
field | name | ||
등록(registered)된 입력 필드의 이름. | |||
field | ref | ||
hook form을 입력 필드와 연결하는데 사용하는 ref. 이 | |||
fieldState | invalid | boolean | 현재 입력 필드의 유효하지 않은 상태. |
fieldState | isTouched | boolean | 현재 제어 입력 필드의 터치된(touched) 상태. |
fieldState | isDirty | boolean | 현재 제어 입력 필드의 변경된(dirty) 상태. |
fieldState | error | object | 특정 입력 필드에 대한 에러. |
formState | isDirty | boolean | 사용자가 입력 중 하나라도 수정한다면
|
formState | dirtyFields | object | 사용자가 수정한 필드를 포함하는 객체입니다. 라이브러리가
|
formState | touchedFields | object | 사용자가 상호작용한 모든 입력을 포함하는 객체입니다. |
formState | defaultValues | object | useForm의 defaultValues에 설정된 값 또는 reset API를 통해 업데이트된 defaultValues입니다. |
formState | isSubmitted | boolean | 폼이 제출된 후 true 로 설정됩니다.reset 메서드가 호출될 때까지 true 로 유지됩니다. |
formState | isSubmitSuccessful | boolean | 런타임 에러 없이 폼이 성공적으로 제출되었음을 나타냅니다. |
formState | isSubmitting | boolean | 폼이 현재 제출 중이면 true , 그렇지 않으면 false 입니다. |
formState | isLoading | boolean | 비동기 기본 값을 로드 중인 경우 중요: 이 속성은 비동기
|
formState | submitCount | number | 폼이 제출된 횟수입니다. |
formState | isValid | boolean | 폼에 에러가 없으면 true 로 설정됩니다.
|
formState | isValidating | boolean | 유효성 검사 중 true 로 설정됩니다. |
formState | validatingFields | boolean | 비동기 유효성 검사가 이뤄지는 필드를 캡쳐합니다. |
formState | errors | object | 필드 에러가 포함된 객체입니다. 에러 메세지를 쉽게 가져오기 위해 ErrorMessage도 있습니다. |
Examples
import { TextField } from "@material-ui/core";import { useController, useForm } from "react-hook-form";function Input({ control, name }) {const {field,fieldState: { invalid, isTouched, isDirty },formState: { touchedFields, dirtyFields }} = useController({name,control,rules: { required: true },});return (<TextFieldonChange={field.onChange} // hook form에 값 전달onBlur={field.onBlur} // 입력 필드가 touched/blur 되었을 때 알림value={field.value} // 입력값name={field.name} // 입력 필드의 이름을 전달inputRef={field.ref} // 입력 필드의 ref를 전달하여, 에러가 발생했을 때 입력 필드에 포커스를 맞출 수 있도록 함/>);}
Tips
MUI, AntD, Chakra UI와 같은 외부 제어 컴포넌트를 사용할 때 각 prop의 역할을 이해하는 것이 중요합니다. 이 props는 입력값을 감지하고, 보고하며 설정하는 역할을 합니다.
onChange: hook form으로 다시 데이터 전달.
onBlur: 입력 필드에서 사용자의 상호작용(focus 및 blur)이 있었음을 보고.
value: 입력 필드의 초기 값 및 변경된 값을 설정.
ref: 에러 발생 시 해당 입력 필드로 포커스를 이동할 수 있도록 함.
name: 입력 필드에 고유한 이름을 부여.
상태를 직접 관리하면서
useController
를 함께 사용하는 것도 괜찮습니다.const { field } = useController();const [value, setValue] = useState(field.value);onChange={(event) => {field.onChange(parseInt(event.target.value)) // hook form으로 다시 데이터 전달setValue(event.target.value) // UI 상태}}입력을 다시 등록(
register
)하지 마세요. 이 커스텀 훅은 등록(registration)과정을 처리하도록 설계되었습니다.const { field } = useController({ name: 'test' })<input {...field} /> // ✅<input {...field} {...register('test')} /> // ❌ 등록(registration) 중복컴포넌트당 하나의
useController
를 사용하는 것이 이상적입니다. 만약 여러 개를 사용해야 한다면, name prop을 변경해야 합니다.Controller
를 사용하는 것도 고려해보세요.const { field: input } = useController({ name: 'test' })const { field: checkbox } = useController({ name: 'test1' })<input {...input} /><input {...checkbox} />
지원해 주셔서 감사합니다
프로젝트에서 React Hook Form이 유용하다고 생각하신다면, 스타를 눌러 지원해 주시길 부탁드립니다.