<star />

๋ฆฌ์•กํŠธ์˜ ํผ ๋ณธ๋ฌธ

React ๐Ÿ“

๋ฆฌ์•กํŠธ์˜ ํผ

๋ณ„๊น… 2022. 11. 30. 15:33
728x90

 

ํผ์€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•จ.

 

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 ์„ ๋„ฃ์–ด ์ฃผ๋ฉด ๋จ.

 

 

728x90
Comments