๋ฆฌ์กํธ ํ
ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋น์ ์ด ์ปดํฌ๋ํธ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด ์๋ค๋ ์ค๋ช
์ด ์์๋ค. ๋น์ ์ด ์ปดํฌ๋ํธ๋ ๋ฌด์์ด๊ณ , ์ ์ด ์ปดํฌ๋ํธ๋ ๋ฌด์์ด๋ ๋ง์ธ๊ฐ?
์ค๋์ ์ด๊ฒ์ ๋ํด ๊ณต๋ถํด๋ณด๋ ค๊ณ ํ๋ค.
๋ฆฌ์กํธ ๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด
์ ์ด ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์์ ์ ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ์ state๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ๋ฐ์ดํธํฉ๋๋ค. React์์๋ ๋ณ๊ฒฝํ ์ ์๋ state๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ปดํฌ๋ํธ์ state ์์ฑ์ ์ ์ง๋๋ฉฐ setState()์ ์ํด ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
(์ค๋ต)
์ด๋ฌํ ๋ฐฉ์์ผ๋ก React์ ์ํด ๊ฐ์ด ์ ์ด๋๋ ์ ๋ ฅ ํผ ์๋ฆฌ๋จผํธ๋ฅผ โ์ ์ด ์ปดํฌ๋ํธ (controlled component)โ๋ผ๊ณ ํฉ๋๋ค.
export default function App() {
const [input, setInput] = useState("");
const onChange = (e) => {
setInput(e.target.value);
};
return (
<div className="App">
<input onChange={onChange} />
</div>
);
}
์ฆ, ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ๋ ์ปดํฌ๋ํธ์ event ๊ฐ์ฒด๋ฅผ ์ด์ฉํด setState()๋ก ๊ฐ์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ ์ด ์ปดํฌ๋ํธ ๋ฐฉ์์ด๋ผ๊ณ ํ๋ค. ์ ์ด ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ๊ณผ ์ ์ฅ๋๋ ๊ฐ์ด ์ค์๊ฐ์ผ๋ก ๋๊ธฐํ๋๋ค.
๋น์ ์ด ์ปดํฌ๋ํธ๋ ๊ธฐ์กด์ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ ๋ฐฉ์์ด๋ค. ๋ฐ๋๋ผ์์ ํผ์ ์ ์ถํ๋ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ์์ ๋ด๋ถ์ ๊ฐ์ ์ป์ ์ ์์๋ ๊ฒ์ ์๊ฐํ๋ฉด ๋๋ค. ๋น์ ์ด ์ปดํฌ๋ํธ ๋ฐฉ์์ ์ฌ์ฉํ ๋ setState()๊ฐ ์๋ ref
๋ฅผ ์ฌ์ฉํด ๊ฐ์ ์ป๊ณ , ๊ทธ ๊ฐ์ด ์ค์๊ฐ์ผ๋ก ๋๊ธฐํ๋์ง ์๋๋ค. ๋ง์ฝ A์ B๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ์์ ๋, A์ ๋ํ ๋ณํ๋ฅผ ์ฆ๊ฐ์ ์ผ๋ก B๊ฐ ์ํฅ์ ๋ฐ์์ผ ํ ๋ ๋น์ ์ด ์ปดํฌ๋ํธ๋ ์ด๋ฐ ๋ฐฉ์์ ๋ํ ๋์์ ํ ์ ์๋ค.
export default function App() {
const inputRef = useRef(); // ref ์ฌ์ฉ
const onClick = () => {
console.log(inputRef.current.value);
};
return (
<div className="App">
<input ref={inputRef} />
<button type="submit" onClick={onClick}>
์ ์ก
</button>
</div>
);
}
์ ๋ฆฌํ์๋ฉด,
์ ์ด ์ปดํฌ๋ํธ
์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์
๋ ฅ์ ํ๋ ์ก์
์ ์ทจํ ๋๋ง๋ค ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํจ๋ค. ์ด๋ ๋ฐ์ดํฐ์ UI์์ ์
๋ ฅํ ๊ฐ์ด ํญ์ ๋๊ธฐํ๋จ์ ์ ์ ์๋ค. (ํญ์ ์ต์ ๊ฐ ์ ์ง)
๋ฐ๋ฉด ๋น์ ์ด ์ปดํฌ๋ํธ
์ ๊ฒฝ์ฐ, ํ๋์์ ์ฌ์ฉ์๊ฐ ์ง์ ๊ฐ์ ํธ๋ฆฌ๊ฑฐํด์ผ ๊ฐ์ ์ป์ ์ ์๋ค. ์ฌ์ฉ์๊ฐ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ ๊น์ง๋ ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํค์ง๋ ์๊ณ ๊ฐ์ ๋๊ธฐํ์ํค์ง๋ ์๋๋ค.
์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ข์ ๋ฐฉ์์ ๋ณดํต ์๋ ์ธ๊ฐ์ง๋ผ๊ณ ํ๋ค.
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋๊ธฐํ๋๊ธฐ ๋๋ฌธ์, ๋ถํ์ํ ๋จ์ด ์ ๋ ฅ์์๋ ๊ฐ์ด ๊ฐฑ์ ๋์ด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง/api ์์ฒญ์ผ๋ก ์ด์ด์ง ์ ์๋ค.(-> ์์๋ญ๋น) ์ด๋ฐ ๋ถํ์ํ ๋ฐฉ๋ฒ์ ๋ง๊ธฐ ์ํด์ ์ค๋กํ์ด๋ ๋๋ฐ์ด์ฑ์ ์ฌ์ฉํ ์ ์๋ค. (throttle & debounce)
์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ form ์์์์ ์ํ์ ๋๊ธฐํ๊ฐ ํ์ํ ๊ฑด ์๋๊ณ , form ์์๊ฐ ์ฆ๊ฐํ ์๋ก ๋ชจ๋ ์ปดํฌ๋ํธ์ ์ฐ๋กํ์ด๋ ๋๋ฐ์ด์ฑ์ ๊ฑธ๊ธฐ๋ ํ๋ค๋ค. ๋ง์ฝ ๊ฐ์ด ํธ๋ฆฌ๊ฑฐ ๋ ์ดํ์ ๊ฐฑ์ ์ด ๋์ด๋ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ref๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ๋ถํ์ํ ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ๋ฐ ๋์ฑ ๋์์ด ๋ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋น์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด ๋ ๋๋ง์ ์ต์ ํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ react-hook-form ์ด๋ค.
์ ์ด ์ปดํฌ๋ํธ์ ๋น์ ์ด ์ปดํฌ๋ํธ์ ๋ํด ์๊ณ ๋๋, ๋ฆฌ์กํธ ํ ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฉ์ฑ์ ๋ํด ๋ ๊น์ด ์ดํดํ ์ ์๊ฒ ๋์๋ค. ๋ฌด์กฐ๊ฑด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ผ ์ ๋ช ํ ๊ฑฐ๋ง ์ฐพ์์ ์ธ ๊ฒ ์๋๋ผ ๊ฑฐ๊ธฐ์ ๋ด๊ธด ์ฒ ํ์ด๋ ํ์์ฑ์ ๋ํด ๊ณต๋ถํ๊ณ , ๋ด๊ฐ ์ฃผ์ฒด์ ์ผ๋ก ์๊ฐํ๋ ๊ฒ ์ค์ํ๊ตฌ๋ ๋ผ๊ณ ๋ค์ ํ ๋ฒ ๋๊ผ๋ค!
์ฐธ๊ณ ์ฌ์ดํธ
justkeepgoing ๋์ ๋ฒจ๋ก๊ทธ