본문으로 건너뛰기

Controller

</> Controller: ControllerProps

React Hook Form은 비제어 컴포넌트와 네이티브 입력을 지향하지만 React-Select, AntD, MUI 같은 외부 제어 컴포넌트를 사용해야 할 때가 있습니다. 이 래퍼 컴포넌트는 이런 컴포넌트와의 연동을 간소화합니다.

참고: 폼 외부에서 필드 값만 제어하려면 Controller를 사용할 필요가 없습니다. values 옵션을 useForm에서 사용하면 됩니다.

Props(속성)


다음 표는 Controller의 인수를 설명합니다.

이름타입필수설명
nameFieldPath입력의 고유한 이름입니다.
controlControlcontrol 객체이며 useForm을 호출해 얻습니다. FormProvider를 사용하면 선택 사항입니다.
renderFunction렌더 prop입니다. React 요소를 반환하며 컴포넌트에 이벤트와 값을 연결할 수 있게 하는 함수입니다. 표준과 다른 prop 이름을 사용하는 외부 제어 컴포넌트와의 연동을 간소화합니다. 렌더 콜백에 field(onChange, onBlur, name, ref, value 포함), fieldState, formState 객체를 제공합니다.
rulesObjectregister 옵션과 같은 형식의 검증 규칙이며 다음을 포함합니다.

required, min, max, minLength, maxLength, pattern, validate
shouldUnregisterboolean = false마운트 해제 후 입력의 등록이 해제되고 defaultValues도 제거됩니다.

참고: useFieldArray와 함께 사용하면 입력의 마운트 해제/재마운트와 순서 변경 후 unregister 함수가 호출되므로 이 prop은 사용하지 않는 것이 좋습니다.
disabledboolean = falsev7.46.0부터 disabled prop은 field prop에서 반환됩니다. 제어 입력이 비활성화되고 제출 데이터에서 값이 제외됩니다.
defaultValueunknown중요: undefineddefaultValue 또는 defaultValues에 적용할 수 없으며 후자는 useForm에서 설정합니다.
  • 필드 수준에서 defaultValue를 설정하거나 useFormdefaultValues를 설정해야 합니다. defaultValuesuseForm에서 사용했다면 이 prop은 사용하지 마세요.
  • 폼에서 기본값과 함께 reset을 호출하려면 useFormdefaultValues를 제공해야 합니다.
  • onChangeundefined로 호출하는 것은 유효하지 않습니다. 기본값이나 지운 값으로 null 또는 빈 문자열을 사용하세요.
  • 첫 렌더링에서 field.valueundefined이면 입력이 비제어 상태로 시작하며 나중에 제어 상태가 될 때 React가 경고합니다. 이를 피하려면 항상 defaultValue/defaultValues를 설정하세요.
exactboolean = truev7.68.0부터 입력 이름 구독을 정확히 일치시키며 기본값은 true입니다. v7.81.0부터 exact: true이면 상위 경로 중 하나가 설정될 때도 필드가 업데이트되지만 값의 중첩된 하위 경로가 변경될 때는 업데이트되지 않습니다. 자세한 내용은 useController를 참고하세요.

반환값


다음 표는 Controller가 생성하는 속성을 설명합니다.

객체 이름이름타입설명
fieldonChange(value: any) => void입력값을 라이브러리로 보내는 함수입니다.

입력의 onChange prop에 할당해야 하며 값은 undefined가 아니어야 합니다.
이 prop은 formState를 업데이트하므로 setValue나 필드 업데이트 관련 API를 직접 호출하지 않는 것이 좋습니다.
fieldonBlur() => void입력의 onBlur 이벤트를 라이브러리로 보내는 함수입니다. 입력의 onBlur prop에 할당해야 합니다.
fieldvalueunknown제어 컴포넌트의 현재 값입니다.
fielddisabledboolean입력의 비활성화 상태입니다.
fieldnamestring등록 중인 입력의 이름입니다.
fieldrefReact.Ref훅 폼을 입력에 연결하는 ref입니다. 훅 폼이 오류가 있는 입력에 포커스할 수 있도록 컴포넌트의 입력 ref에 ref를 할당합니다. 이는 대상 컴포넌트가 ref를 전달하거나(React.forwardRef) MUI의 inputRef처럼 동등한 기능을 노출할 때만 동작합니다.
fieldStateinvalidboolean현재 입력의 유효하지 않은 상태입니다.
fieldStateisTouchedboolean현재 제어 입력의 touched 상태입니다.
fieldStateisDirtyboolean현재 제어 입력의 dirty 상태입니다.
fieldStateerrorobjectv7.0.0부터 이 입력에 해당하는 오류입니다.
formStateisDirtyboolean사용자가 입력 중 하나를 수정하면 true로 설정됩니다.
  1. 중요: 폼의 dirty 상태를 비교할 단일 기준을 라이브러리에 제공하려면 useForm 수준에서 모든 입력의 defaultValues를 지정해야 합니다.
  2. 파일 선택을 취소할 수 있고 FileList 객체를 사용하므로 파일 타입 입력은 앱 수준에서 관리해야 합니다.
formStatedirtyFieldsobject사용자가 수정한 필드를 담은 객체입니다. 라이브러리가 defaultValues와 비교할 수 있도록 useForm을 통해 모든 입력의 defaultValues를 제공해야 합니다.
  1. 중요: 각 필드의 dirty 상태를 비교할 단일 기준을 라이브러리에 제공하려면 useForm 수준에서 defaultValues를 지정해야 합니다.
  2. dirty 필드는 전체 폼이 아니라 필드 수준에서 표시되므로 isDirty formState를 나타내지는 않습니다. 전체 폼 상태를 확인하려면 isDirty를 대신 사용하세요.
formStatetouchedFieldsobject사용자가 상호작용한 모든 입력을 담은 객체입니다.
formStatedefaultValuesobjectv7.37.0부터 useFormdefaultValues에 설정했거나 reset API로 업데이트한 defaultValues 값입니다.
formStateisSubmittedboolean폼이 제출되면 true로 설정됩니다. true 상태는 reset 메서드를 호출할 때까지 유지됩니다.
formStateisSubmitSuccessfulboolean런타임 오류 없이 폼이 성공적으로 제출되었음을 나타냅니다.
formStateisSubmittingboolean현재 폼을 제출하고 있으면 true, 그렇지 않으면 false입니다.
formStateisLoadingbooleanv7.41.0부터 현재 폼이 비동기 기본값을 불러오고 있으면 true입니다.
중요: 이 prop은 비동기 defaultValues에만 적용됩니다.
formStatesubmitCountnumber폼을 제출한 횟수입니다.
formStateisValidboolean폼에 오류가 없으면 true로 설정됩니다.

setError는 즉시 isValidfalse로 만듭니다. 이 값 자체는 검증으로부터 파생되지 않으며 다음에 검증이 실행될 때(예: 다음 onChange, 제출, trigger() 호출) 덮어써집니다.
formStateisValidatingboolean검증 중에는 true로 설정됩니다.
formStatevalidatingFieldsobjectv7.51.0부터 비동기 검증 중인 필드를 담습니다.
formStateerrorsobject필드 오류를 담은 객체입니다. 오류 메시지를 쉽게 가져오는 ErrorMessage 컴포넌트도 있습니다.
formStatedisabledbooleanv7.48.0부터 폼이 비활성화되면 true로 설정됩니다. disabled prop을 useForm에서 지정합니다.
formStateisReadybooleanv7.56.0부터 formState 구독 설정이 준비되면 true로 설정됩니다.
예시:

Web

import ReactDatePicker from "react-datepicker"
import { TextField } from "@mui/material"
import { useForm, Controller } from "react-hook-form"

type FormValues = {
ReactDatepicker: string
}

function App() {
const { handleSubmit, control } = useForm<FormValues>()

return (
<form onSubmit={handleSubmit((data) => console.log(data))}>
<Controller
control={control}
name="ReactDatepicker"
render={({ field: { onChange, onBlur, value, ref } }) => (
<ReactDatePicker
onChange={onChange} // send the value to hook form
onBlur={onBlur} // notify when the input is touched or blurred
selected={value}
/>
)}
/>

<input type="submit" />
</form>
)
}

React Native

import { Text, View, TextInput, Button, Alert } from "react-native"
import { useForm, Controller } from "react-hook-form"

export default function App() {
const {
control,
handleSubmit,
formState: { errors },
} = useForm({
defaultValues: {
firstName: "",
lastName: "",
},
})
const onSubmit = (data) => console.log(data)

return (
<View>
<Controller
control={control}
rules={{
required: true,
}}
render={({ field: { onChange, onBlur, value } }) => (
<TextInput
placeholder="First name"
onBlur={onBlur}
onChangeText={onChange}
value={value}
/>
)}
name="firstName"
/>
{errors.firstName && <Text>This is required.</Text>}

<Controller
control={control}
rules={{
maxLength: 100,
}}
render={({ field: { onChange, onBlur, value } }) => (
<TextInput
placeholder="Last name"
onBlur={onBlur}
onChangeText={onChange}
value={value}
/>
)}
name="lastName"
/>

<Button title="Submit" onPress={handleSubmit(onSubmit)} />
</View>
)
}

동영상


다음 동영상에서는 Controller의 내부 구조와 구현 방식을 보여 줍니다.