controlํ input์ ๊ด๋ฆฌํ ๋ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด ๋น์ทํ useController๊ณผ Controller ์ค ๋ญ ์ฐ๋ฉด ์ข์ ์ง์ ๋ํ ์๊ฐ
ํด๋น ๊ธ์ ํ๋ก์ ํธ ๊ฐ๋ฐ ์ค ์ปจ๋ฒค์ ๋ ผ์๋ฅผ ์ํด ๋ง๋ค์ด์ง ์๋ฃ๋ผ ์กด๋๋ง๋ก ์์ฑ๋์์ต๋๋ค.
react-hook-form์์ Input์ ๊ธฐ๋ณธ์ ์ผ๋ก unControlledํฉ๋๋ค. (https://legacy.reactjs.org/docs/uncontrolled-components.html)
register ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ref๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ํผ์ด๋ ์ดํ๋ฆฌ์ผ์ด์ ์์ input์ ๊ฐ์ด ๋ฐ๋ ๋๋ ์ฌ์ฉ์๊ฐ input์ ํ์ดํํ ๋ ๋ฐ์ํ๋ ๋ฆฌ๋ ๋๋ง์ ์์ ์ค์ ๋๋ค.
react-hook-form์์ Input์ ๊ธฐ๋ณธ์ ์ผ๋ก unControlledํฉ๋๋ค. (https://legacy.reactjs.org/docs/uncontrolled-components.html)
register ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ref๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ํผ์ด๋ ์ดํ๋ฆฌ์ผ์ด์ ์์ input์ ๊ฐ์ด ๋ฐ๋ ๋๋ ์ฌ์ฉ์๊ฐ input์ ํ์ดํํ ๋ ๋ฐ์ํ๋ ๋ฆฌ๋ ๋๋ง์ ์์ ์ค์ ๋๋ค.
Controller๋ฅผ ์ฌ์ฉํ ๋์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋น ์ปดํฌ๋ํธ์์๋ง ๋ฆฌ๋ ๋๋ง ๋๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋ ๋๋ง์ ์์ ์ค์ ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก๋ Controlled Input์ Input์ Rerender์ ์ผ์ผํค๊ธฐ ๋๋ฌธ์ ์ฌ๋งํ๋ฉด register๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ๊ฐ๋ Controlled Input์ ์ฌ์ฉํ ๋๊ฐ ์์ต๋๋ค. (ref๋ฅผ ์ฌ์ฉํ ์ ์์ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ input์ ์ฌ์ฉํ ๋ ๋ฑ๋ฑ... )
์ ๊ฐ์ ๊ฒฝ์ฐ์๋ input ์ปดํฌ๋ํธ์ value ์ํ์ ์์กดํ๋ ๊ฐ๋ค์ด ์ฌ๋ฌ ๊ตฐ๋ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์, input์ ๊ฐ์ ์์กดํ๋ ์ฌ๋ฌ ๋ถ๋ถ๊น์ง ๋งค๋ฒ ๋ฆฌ๋ ๋๋ง์ด ํ์ํ๋ค๊ณ ์๊ฐํด์ ๋ฑํ uncontrolled ํ ์ํ์ ์ด์ ์ด ์๋ค๊ณ ์๊ฐํด Controlled Input์ ์ฌ์ฉํ๋ ๊ฒฝํ์ด ์์ต๋๋ค.
React Hook Form์์๋ Controlled Input์ ์ฌ์ฉํ ๋์ useController / Controller ๋ ๊ฐ์ง API๋ฅผ ์ ๊ณตํฉ๋๋ค.
useController์ Controll ์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ์ ๊ฐ๊ธฐ ๋๋ฌธ์, ํ๋๋ก ํต์ผํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ ์๋์ ๊ฐ์ ์ด์ ๋ก useController๋ฅผ ์ ํธํฉ๋๋ค.
์ ๊ฐ ๋๊ผ๋ ๋จ์ ์, useController๋ฅผ ์ฌ์ฉ ์ ๋ง๋ค hook์ ์ฌ๋ฌ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ์ค์ผ ํ๋๊ฒ ๋ถํธํ์ต๋๋ค.
์๋์์๋ ReactDatePicker๋ฅผ ์ฌ์ฉํ๋ form์ ๋ํ ๊ฐ์ ๊ธฐ๋ฅ์, ๊ฐ๊ฐ useController์ Controller๋ก ๊ตฌํํด๋ณด์์ต๋๋ค.
๋น๊ตํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ณต์ ๋ฌธ์: https://react-hook-form.com/docs/usecontroller
import React from "react";
type FormValues = {
ReactDatepicker: string
}
function App() {
const { handleSubmit, control } = useForm();
const { field } = useController({
name: "reactDatePicker",
control
});
return (
<form onSubmit={handleSubmit((data) => console.log(data))}>
<ReactDatePicker
onChange={field.onChange} // send value to hook form
onBlur={field.onBlur} // notify when input is touched/blur
selected={field.value}
/>
<button type="submit">์ ์ถ</button>
</form>
);
}
๊ณต์๋ฌธ์: https://react-hook-form.com/docs/usecontroller/controller
import ReactDatePicker from "react-datepicker"
import { TextField } from "@material-ui/core"
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 value to hook form
onBlur={onBlur} // notify when input is touched/blur
selected={value}
/>
)}
/>
<button type="submit">์ ์ถ</button>
</form>
)
}
๊ผญ ์ด ๋ถ๋ถ์ ํต์ผํ์ง ์๋๋ผ๋, register์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ control์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฐจ์ด, useController๊ณผ Controller ๊ด๋ จ ๋ด์ฉ์ ๊ณต์ ๋๋ฆฌ๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ๋ด์ฉ์ ๊ณต์ ํ๊ฒ ๋์์ต๋๋ค.
๊ด๋ จ discussion link ์ ๋๋ค. https://github.com/orgs/react-hook-form/discussions/7852#discussioncomment-3692813
https://github.com/orgs/react-hook-form/discussions/6157
https://github.com/orgs/react-hook-form/discussions/7554
ํน์ ์ถ๊ฐ์ ์ธ ์๋ฃ๋ ๊ณต์ ํด์ฃผ์ค ์ด์ผ๊ธฐ๊ฐ ์๋ค๋ฉด ๋ ๋ง์ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ๋ฆฐ ๋ด์ฉ / ๋ถ์กฑํ ๋ด์ฉ์ ๋ํ ์ง์ ๋ ์ธ์ ๋ ํ์์ ๋๋ค.