
HTML์ ๊ธฐ๋ณธ ๊ตฌ์กฐ์์ form ํ๊ทธ๋ ๋๋ฌด ์ต์ํ์ง๋ง,
React๋ก ํผ์ ๋ง๋ค๊ธฐ ์์ํ๋ฉด Controlled์ Uncontrolled์ ๊ฐ๋
์ด ์๊ธฐ๋ฉด์ ํผ๋์ด ์์๋๋ค.
์ด๋ฒ ๊ธ์์๋ ๊ธฐ๋ณธ ๊ฐ๋
๋ถํฐ React์ ์
๋ ฅ ์ํ ๊ด๋ฆฌ ๋ฐฉ์๊น์ง ์ ๋ถ ์ ๋ฆฌํด๋ดค๋ค.
form<form action="/submit" method="POST">
<label>
์ด๋ฆ: <input type="text" name="username" />
</label>
<button type="submit">์ ์ถ</button>
</form>
action: ๋ฐ์ดํฐ๋ฅผ ์ ์กํ URLmethod: ์ ์ก ๋ฐฉ์ (GET, POST, etc.)name: ์๋ฒ๋ก ์ ์ก๋ keyonSubmit: ์๋ฐ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ๋์ฒด ๊ฐ๋ฅReact์์๋ ๋ณดํต onChange๋ก ๊ฐ์ ๋ฐ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋๋๋ฐ,
์ด๋ ์ํ์ input์ด ์ฐ๊ฒฐ๋์ด ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ 2๊ฐ์ง๋ก ๋๋๋ค.
์ํ(
useState)๋ก ์ ๋ ฅ๊ฐ์ ๊ด๋ฆฌํ๋ฉฐ,value์onChange๊ฐ ๋ฐ์ธ๋ฉ๋จ
const [name, setName] = useState('');
return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
/>
<button type="submit">์ ์ถ</button>
</form>
);
์ํ๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ์ง ์๊ณ , DOM์ ์ง์ ์ฐธ์กฐํ์ฌ ๊ฐ์ ๊ฐ์ ธ์ด
const inputRef = useRef();
const handleSubmit = (e) => {
e.preventDefault();
console.log(inputRef.current.value);
};
return (
<form onSubmit={handleSubmit}>
<input type="text" ref={inputRef} />
<button type="submit">์ ์ถ</button>
</form>
);
| ์ํฉ | ์ถ์ฒ ๋ฐฉ์ |
|---|---|
| ์ ๋ ฅ๊ฐ์ ์ ์ดํด์ผ ํจ (์ ํจ์ฑ๊ฒ์ฌ ๋ฑ) | Controlled |
| ๋จ์ ์ ๋ ฅ๋ง ๋ฐ๊ณ ์ ์ถํ ๊ฒฝ์ฐ | Uncontrolled |
| ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Formik, React Hook Form ๋ฑ) ์ฌ์ฉ | ๋ ๋ค ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ |
์ฒ์์๋ ๋ฌด์กฐ๊ฑด Controlled ๋ฐฉ์์ผ๋ก๋ง ํผ์ ๊ตฌํํ๋๋ฐ,
์๊ฐ๋ณด๋ค input์ด ๋ง์์ง๋ฉด ์ฝ๋๋ ๋ณต์กํด์ง๊ณ ๋ฆฌ๋ ๋๋ง๋ ๋ง์์ง๋ ๊ฑธ ๋๊ผ๋ค.
ํนํ useRef๋ฅผ ์ฐ๋ฉด ์ฑ๋ฅ ์ต์ ํ๋ ๊ฐ๋จํ ์
๋ ฅ ์ฒ๋ฆฌ์ ๊ฝค ์ ์ฉํ๋ค๋ ๊ฑธ ์๊ฒ ๋๋ค.
๐ง โํผ์ ๋จ์ํด ๋ณด์ฌ๋ ๋ณต์กํ ์ธํฐ๋์ ์ด ๋ง๋ค. ์ํ๋ฅผ ์ ์ดํ ์ง ๋ง์ง๋ฅผ ๋จผ์ ๊ณ ๋ฏผํ์.โ