๋ฆฌ์กํธ๋ ํผ(Form) ์์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ์ ์ด ์ปดํฌ๋ํธ์ ๋น์ ์ด ์ปดํฌ๋ํธ๋ก ๊ตฌ๋ถํ๋ค.
ํผ ์์์ ๊ฐ์ ๋ฆฌ์กํธ์ state๊ฐ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
state๊ฐ ๋จ์ผ ๋ฐ์ดํฐ ์ถ์ฒ๊ฐ ๋๋ฉฐ ํผ ์
๋ ฅ ์์์ value ์์ฑ์ state์ ์ํด ๊ฒฐ์ ๋๋ค. ์ฌ์ฉ์์ ์
๋ ฅ์ด ๋ฐ์ํ๋ฉด 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>
);
}
์ฌ์ฉ์๊ฐ input์ ๊ฐ์ ์
๋ ฅํ๋ฉด onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ setName(e.target.value)๋ฅผ ํตํด state๊ฐ ์
๋ฐ์ดํธ๋๋ค. ์ดํ state ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ฉฐ input์ value๊ฐ ์๋ก์ด state ๊ฐ์ผ๋ก ๊ฐฑ์ ๋๋ ๋ฐฉ์์ด๋ค.
1) ์ค์๊ฐ ์ ํจ์ฑ ๊ฒ์ฌ
if(name.length < 2) {
// ๊ฒฝ๊ณ ๋ฉ์์ง ํ์
}
2) ์
๋ ฅ๊ฐ ๊ธฐ๋ฐ UI ๋ณ๊ฒฝ
{/* ์ ๋ ฅ๊ฐ์ด ์์ผ๋ฉด ๋ฒํผ ๋นํ์ฑํ */}
<button disabled={!name}>์ ์ถ</button>
3) ์
๋ ฅ ํ์ ๊ฐ์
<input
type="text"
value={name}
onChange={(e) =>
setName(
// ์ซ์๋ง ์ ๋ ฅ ํ์ฉ
e.target.value.replace(/[^0-9]/g, '')
)
}โ
/>
ํผ ๋ฐ์ดํฐ๋ฅผ DOM์ด ์ง์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
์ฆ ์
๋ ฅ๊ฐ์ state๋ก ๋งค๋ฒ ๊ด๋ฆฌํ์ง ์๊ณ ํ์ํ ๋๋ง ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด๋ค. ๋ฆฌ์กํธ์์๋ ๋ณดํต ref๋ฅผ ์ฌ์ฉํด DOM ์์์ ์ง์ ์ ๊ทผํ์ฌ ๊ฐ์ ์ฝ๋๋ค.
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>
);
}
ํผ ๋ฐ์ดํฐ์ ์ถ์ฒ๊ฐ state๊ฐ ์๋ DOM์ด ๋๋ฉฐ value ๋์ defaultValue๋ฅผ ์ฌ์ฉํ๋ค. ํ์ํ ๋๋ง ref๋ฅผ ํตํด input ์์์ ์ง์ ์ ๊ทผํ์ฌ ๊ฐ์ ๊ฐ์ ธ์จ๋ค. ์
๋ ฅ ์ state ๋ณ๊ฒฝ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๋๋ค.
1) ํ์ผ ์
๋ ฅ
๋ฆฌ์กํธ์์๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ด ์ปดํฌ๋ํธ ์ฌ์ฉ์ด ๊ถ์ฅ๋์ง๋ง ํ์ผ ์
๋ ฅ์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ณด์ ์ ์ฑ
๋๋ฌธ์ value๋ฅผ ์ง์ ์ ์ดํ ์ ์๋ค.
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>
);
}
