material ui처럼 반드시 controlled component 형태로 사용하는 라이브러리들이 있는데,
이런 컴포넌트들은 등록할 때 register 대신 control이라는 객체를 사용한다
const {
register,
control,
formState: { errors },
} = useFormContext<ContentData>();
또한 Controller라는 wrapper 컴포넌트로 래핑해서 react hook form과 사용해야한다
<Controller
name="gender"
control={control}
rules={{ required: "please choice gender" }}
render={({ field: { onChange } }) => {
return (
<RadioInput
dataList={[
{ id: 0, gender: "남성" },
{ id: 1, gender: "여성" },
]}
handleCheck={onChange}
/>
);
}}
/>
{errors.gender && <p>{errors.gender.message}</p>}
{/** RadioInput **/}
function RadioInput({ dataList, handleCheck }: Props) {
const handleChange: ChangeEventHandler<HTMLInputElement> = (e) => handleCheck(e.currentTarget.value);
return (
<>
{dataList.map(({ id, gender }) => (
<Fragment key={id}>
<input type="radio" value={gender} name="gender" onChange={handleChange} />
{gender}
</Fragment>
))}
</>
);
}
render를 사용해서 field 값을 복사하거나 꺼내쓰면 된다
field에는 value, onBlur, onChange 등등 이 있다
render안의 onChange를 조작해 onChange안에 들어갈 값을 선택할 수 있다
useForm
useFormContext