ํผ์ ๋ง๋ค ๋ ์ํ๋ฅผ ์ปดํฌ๋ํธ๊ฐ ๊ด๋ฆฌํ๋ ๊ฒ์ Controlled ๋ธ๋ผ์ฐ์ DOM์ ๋งก๊ธฐ๋ ๊ฒ์ Uncontrolled ๋ผ๊ณ ํ๋ค.
๋ ๋ฐฉ์์ ๊ธฐ๋ณธ ๊ฐ๋
๊ณผ ์ฐจ์ด์ ์ ๋ํด ์์๋ณด์.
์
๋ ฅ๊ฐ์ ๋จ์ผ ์์ค๋ฅผ ๋ฆฌ์กํธ state๋ก ๋์ด ๋ ๋๋ง ์ input value๊ฐ ์ฑ์์ง๊ณ ์ฌ์ฉ์๊ฐ ํ์ดํ ํ๋ฉด onChange ํจ์๋ก state๊ฐ ์
๋ฐ์ดํธ๋์ด ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋ ๋ฐฉ์์ด๋ค.
์์ธก์ด ๊ฐ๋ฅํ๊ณ ๋๋ฒ๊น
์ด ์ฝ๋ค๋ ์ฅ์ ์ด ์๋ค.
import { useState } from 'react';
export default function Controlled() {
const [name, setName] = useState('');
return (
<label>
์ด๋ฆ
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
/>
</label>
);
}
์
๋ ฅ๊ฐ์ ์ค์๊ฐ ์ํ๋ DOM์ด ๋ณด์ ํ๊ณ ์ด๊ธฐ๊ฐ์ defaultValue/defaultChecked๋ก ์ง์ ํ๋ ๋ฐฉ์์ ์๋ฏธํ๋ค. ํ์ํ ์๊ฐ์ ref.current.value ๋๋ FormData๋ก ๊ฐ์ ์ฝ์ด์จ๋ค.
import { useRef } from 'react';
export default function Uncontrolled() {
const inputRef = useRef(null);
function handleSubmit(e) {
e.preventDefault();
const value = inputRef.current?.value ?? '';
alert('์
๋ ฅ๊ฐ: ' + value);
}
return (
<form onSubmit={handleSubmit}>
<label>
์ด๋ฆ
<input
type="text"
defaultValue="BlueCool"
ref={inputRef}
/>
</label>
<button type="submit">๋ฑ๋ก</button>
</form>
);
}
ํ์ผ ์
๋ ฅ์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ณด์ ์ ์ฑ
์ value๋ฅผ ์ง์ ์ ์ดํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ Uncontrolled์ฌ์ผ ํ๋ค.
import { useRef } from 'react';
function FileInput() {
const ref = useRef(null);
return (
<div>
<input type="file" ref={ref} />
<button
onClick={() => {
if (ref.current) ref.current.value = '';
}}
>
์ด๊ธฐํ
</button>
</div>
);
}
์ ์ด ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ ๊ฐ์ state๋ก ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํญ์ ์ต์ ๊ฐ์ ๊ฐ์ง๊ณ ์์ด ์
๋ ฅ ์ฆ์ ๊ฒ์ฆ์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๋ค. ํ์ง๋ง ์
๋ ฅ๋ง๋ค ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋ ์ฑ๋ฅ ๋น์ฉ์ด ์ปค์ง ์ ์๋ค.
๋ฐ๋ผ์ ์ค์๊ฐ ๋๊ธฐํ, ๊ฒ์ฆ, ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ํ์ผ ์
๋ ฅ ํน์ ํ์ดํ ์ฑ๋ฅ์ด ์ค์ํ ๊ฒฝ์ฐ์๋ ๋น์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ์ข๋ค.
