<star />
๋ฆฌ์กํธ์ ํผ ๋ณธ๋ฌธ
ํผ์ ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ์ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํจ.
1) ์ ์ด ์ปดํฌ๋ํธ
> ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ์ ๊ทผํ๊ณ , ์ ์ดํ ์ ์๋๋ก ํด ์ฃผ๋ ์ปดํฌ๋ํธ
์ ์ด ์ปดํฌ๋ํธ๋ ๊ทธ ๊ฐ์ด ๋ฆฌ์กํธ์ ํต์ ๋ฅผ ๋ฐ๋ ์ ๋ ฅ ํผ ์๋ฆฌ๋จผํธ (input form element) ๋ฅผ ์๋ฏธํจ.
function NameForm (props) {
const [value, setValue] = useState('');
const handleChange = (event) => {
setValue(event.target.value);
}
const handleSubmit = (event) => {
alert('์
๋ ฅํ ์ด๋ฆ: ' + value);
event.preventDefault();
}
return (
<form onSubmit={handleSubmit}>
<label>
์ด๋ฆ :
<input type="text" value={value} onChange={handleChange} />
</label>
<button type="submit">์ ์ถ</button>
</form>
)
}
์์ ์ฝ๋์์ <input> ํ๊ทธ์ value={value} ๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ state ์์ ๊ฐ์ ๊ฐ์ ธ๋ค ๋ฃ์ด ์ฃผ๋ ๊ฒ์.
๊ทธ๋์ ํญ์ state ์ ๋ค์ด ์๋ ๊ฐ์ด input ์ ํ์๋จ!
๋ํ, ์ ๋ ฅ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋, ํธ์ถ๋๋ onChange ์๋ onChange={handleChange} ์ฒ๋ผ handleChange ํจ์๊ฐ ํธ์ถ๋๋๋ก ํ๋๋ฐ, handleChange ํจ์์์๋ setValue() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋กญ๊ฒ ๋ณ๊ฒฝ๋ ๊ฐ์ value ๋ผ๋ ์ด๋ฆ์ state ์ ์ ์ฅํจ.
onChange ์ฝ๋ฐฑ ํจ์์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ event๋ ์ด๋ฒคํธ ๊ฐ์ฒด๋ฅผ ๋ํ๋.
event.target ์ ํ์ฌ ๋ฐ์ํ ์ด๋ฒคํธ์ ํ๊ฒ์ ์๋ฏธํจ.
event.target.value ๋ ํด๋น ํ๊ฒ์ value ์์ฑ๊ฐ์ ์๋ฏธํจ.
์ฆ, ์ฌ๊ธฐ์์์ ํ๊ฒ์ input ์๋ฆฌ๋จผํธ๊ฐ ๋๋ฉฐ event.target.value ๋ input ์๋ฆฌ๋จผํธ์ ๊ฐ์ด ๋จ.
์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ์ ๋ ฅ ์์ ๊ฐ์ ์ํ๋๋๋ก ์กฐ์ข ํ ์ ์๋ค.
const handleChange = (event) => {
setValue(event.target.value.toUpperCase());
}
์์ ์ฝ๋์์ handleChange() ํจ์๋ก ๋ค์ด์ค๋ ์ด๋ฒคํธ ํ๊ฒ ๊ฐ์ toUpperCase() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋๋ฌธ์๋ก ๋ณ๊ฒฝํ ๋ค์ ๊ทธ ๊ฐ์ state ์ ์ ์ฅํจ. ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ํตํด ์ฌ์ฉ์์ ์ ๋ ฅ์ ์ง์ ์ ์ดํ ์ ์์!
2) textarea ํ๊ทธ
function RequestForm (props) {
const [value, setValue] = useState('์์ฒญ ์ฌํญ์ ์
๋ ฅํ์ธ์.');
const handleChange = (event) => {
setValue(event.target.value);
}
const handleSubmit = (event) => {
alert('์
๋ ฅํ ์์ฒญ์ฌํญ' + value);
event.preventDefault();
}
return (
<form onSubmit={handleSubmit}>
<label>
์์ฒญ์ฌํญ :
<textarea value={value} onChange={handleChange} />
</label>
<button type="submit">์ ์ถ</button>
</form>
)
}
์ ์ฝ๋๋ ๊ณ ๊ฐ์ผ๋ก๋ถํฐ ์์ฒญ์ฌํญ์ ์ ๋ ฅ๋ฐ๊ธฐ ์ํ RequestForm ์ปดํฌ๋ํธ์.
state ๋ก๋ value ๊ฐ ์๊ณ , ์ด ๊ฐ์ <textarea> ํ๊ทธ์ value ๋ผ๋ attribute ์ ๋ฃ์ด์ค์ผ๋ก์จ ํ๋ฉด์ ๋ํ๋จ.
์ฌ๊ธฐ์์ value ๋ฅผ ์ ์ธํ ๋ ์ด๊ธฐ๊ฐ์ ๋ฃ์ด ์คฌ๊ธฐ ๋๋ฌธ์ ์ฒ์ ๋ ๋๋ง ๋ ๋๋ถํฐ <textarea> ์ ํ ์คํธ๊ฐ ๋ํ๋๊ฒ ๋จ.
3) select ํ๊ทธ
function TheboyzSelect (props) {
const [value, setValue] = useState('grape');
const handleChange = (event) => {
setValue(event.target.value);
}
const handleSubmit = (event) => {
alert('์ ํํ ๋ฉค๋ฒ: ' + value);
event.preventDefault();
}
return (
<form onSubmit={handleSubmit}>
<label>
๋๋ณด์ด์ฆ ๋ฉค๋ฒ๋ฅผ ์ ํํด ์ฃผ์ธ์ :
<select value={value} onChange={handleChange}>
<option value="hyunjae">ํ์ฌ</option>
<option value="q">ํ</option>
<option value="new">๋ด</option>
<option value="juhaknyeon">์ฃผํ๋
</option>
</select>
</label>
<button type="submit">์ ์ถ</button>
</form>
)
}
์ ์ฝ๋์ TheboyzSelect ๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ์์.
์ด ์ปดํฌ๋ํธ์ state ๋ grape ๋ผ๋ ์ด๊ธฐ๊ฐ์ ๊ฐ์ง value ๊ฐ ํ๋ ์์.
๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ์ <select> ํ๊ทธ์ value ๋ก ๋ฃ์ด ์ฃผ๊ณ ์์.
๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ ์์ ๋ง์ฐฌ๊ฐ์ง๋ก handleChange() ํจ์์์ setValue() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ๋ฐ์ดํธ ํจ.
์ด ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ต์ ์ ์ ํํ์ ๋ value ๋ผ๋ ํ๋์ ๊ฐ๋ง์ ์ ๋ฐ์ดํธ ํ๋ฉด ๋๊ธฐ ๋์ ํธ๋ฆฌํจ.
<select multiple={true} value={['b', 'c']}>
๋ง์ฝ, ๋ชฉ๋ก์์ ๋ค์ค์ผ๋ก ์ ํ์ด ๋๋๋ก ํ๋ ค๋ฉด multiple ์ด๋ผ๋ ์์ฑ๊ฐ์ true ๋ก ํ๊ณ , value ๋ก ์ ํ๋ ์ต์ ์ ๊ฐ์ด ๋ค์ด ์๋ ๋ฐฐ์ด์ ๋ฃ์ด ์ฃผ๋ฉด ๋จ!
<input type="text"> ํ๊ทธ
<textarea> ํ๊ทธ
<select> ํ๊ทธ
๋ฅผ ์ ์ด ์ปดํฌ๋ํธ๋ก ๋ง๋๋ ๋ฐฉ์์ ๋ชจ๋ ๋น์ทํจ.
๋ชจ๋ value ๋ผ๋ attribute ๋ฅผ ํตํด์ ๊ฐ์ ์ ๋ฌํ๊ณ , ๊ฐ์ ๋ณ๊ฒฝํ ๋๋ onChange ์์ setValue() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ๋ฐ์ดํธ ํจ.
์ด๋ฌํ ๋ฐฉ์์ ๋ชจ๋ ์ค์ ๋ก ์ฌ์ฉ์๊ฐ ์ ๋ ฅ์ ๋ฐ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ๊ธฐ ๋์๋กฑ ์ ๊ธฐ์ตํด์ผ ํจ~
4) File input ํ๊ทธ
<input type="file" />
file input ํ๊ทธ๋ ๊ทธ ๊ฐ์ด ์ฝ๊ธฐ ์ ์ฉ (Read-Only) ์ด๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ์์๋ ๋น์ ์ด ์ปดํฌ๋ํธ (uncontrolled component) ๊ฐ ๋จ.
5) ์ฌ๋ฌ ๊ฐ์ ์ ๋ ฅ ๋ค๋ฃจ๊ธฐ
function Reservation (props) {
const [haveBreakfast, setHaveBreakfast] = useState(true);
const [numberOfGuest, setNumberOfGuest] = useState(2);
const handleSubmit = (event) => {
alert(`์์นจ ์์ฌ ์ฌ๋ถ : ${haveBreakfast}, ๋ฐฉ๋ฌธ๊ฐ ์ : ${numberOfGuest}`);
event.preventDefault();
}
return (
<form onSubmit={handleSubmit}>
<label>
์์นจ ์์ฌ ์ฌ๋ถ :
<input
type="checkbox"
checked={haveBreakfast}
onChange={(event) => {
setHaveBreakfast(event.target.checked);
}}
/>
</label>
<label>
๋ฐฉ๋ฌธ๊ฐ ์ :
<input
type="number"
value={numberOfGuest}
onChange={(event) => {
setNumberOfGuest(event.target.value);
}}
/>
</label>
<button type="submit">์ ์ถ</button>
</form>
)
}
์ ์ฝ๋์ Reservation ์ปดํฌ๋ํธ๋ ์์ฝ์ ํ๊ธฐ ์ํด ํ์ํ ์ ๋ณด ๋ ๊ฐ์ง๋ฅผ ์ ๋ ฅ๋ฐ๋๋ก ๋์ด ์์.
์์นจ ์์ฌ ์ ํ ์ ๋ฌด๋ฅผ ์ ๋ ฅ๋ฐ๊ธฐ ์ํ <input> ํ๊ทธ๋ type checkbox ๋ก ๋์ด ์๊ณ , ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด setHaveBreakfast() ํจ์๋ฅผ ํตํด ๊ฐ์ ์ ๋ฐ์ดํธ ํจ.
๋ฐฉ๋ฌธ๊ฐ ์๋ฅผ ์ ๋ ฅ๋ฐ๊ธฐ ์ํ <input> ํ๊ทธ๋ type ์ด number ๋ก ๋์ด ์๊ณ , ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด setNumberOfGuest() ํจ์๋ฅผ ํตํด ๊ฐ์ ์ ๋ฐ์ดํธ ํจ.
ํจ์ ์ปดํฌ๋ํธ์์๋ ๊ฐ state ์ ๋ณ์๋ง๋ค set ํจ์๊ฐ ๋ฐ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ํํ๋ก ๊ฐ๊ฐ์ set ํจ์๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๋ฉด ๋จ.
5) input null value
์ ์ด ์ปดํฌ๋ํธ์์๋ value prop ์ ์ ํด์ง ๊ฐ์ผ๋ก ๋ฃ์ผ๋ฉด ์ฝ๋๋ฅผ ์์ ํ์ง ์๋ ํ ์ ๋ ฅ๊ฐ์ ๋ฐ๊ฟ ์ ์์.
๋ง์ฝ value prop ์ ๋ฃ๋, ์์ ๋กญ๊ฒ ์ ๋ ฅํ ์ ์๊ฒ ๋ง๋ค๊ณ ์ถ์ผ๋ฉด ๊ฐ์ undefined ๋๋ null ์ ๋ฃ์ด ์ฃผ๋ฉด ๋จ.
'React ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ์กํธ์ ํฉ์ฑ๊ณผ ์์ (0) | 2022.12.03 |
---|---|
State ๋์ด์ฌ๋ฆฌ๊ธฐ (0) | 2022.12.01 |
๋ฆฌ์คํธ์ ํค (0) | 2022.11.29 |
์กฐ๊ฑด๋ถ ๋ ๋๋ง (0) | 2022.11.28 |
์ด๋ฒคํธ ํธ๋ค๋ง (0) | 2022.11.26 |