elice/WIL

[week_08] React ๊ธฐ์ดˆ โ…ก (1) ์ด๋ฒคํŠธ

๊ฑด๋ง๋”” 2022. 3. 2. 21:41

1. ์ด๋ฒคํŠธ(event)

์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” HTML ์š”์†Œ์— ๋Œ€ํ•œ ์‚ฌ๊ฑด์˜ ๋ฐœ์ƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์œ ์ €์˜ ํ–‰๋™์— ์˜ํ•ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ ๋กœ์ง์— ์˜ํ•ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐœ์ƒ๋œ ์ด๋ฒคํŠธ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์–‘ํ•œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถ”๋ ฅํ•ด์„œ ์•Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

1-1. ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ(ํ•ธ๋“ค๋ง) ๋ฐฉ๋ฒ•

const App = () => {
	const handleChange = (event) => {
    	console.log("์ž…๋ ฅ๊ฐ’ : " + event.target.value);
    }
    return (
    	<div>
        	<input onChange={handleChange} />
        </div>
    );
};

DOM Element์˜ ๊ฒฝ์šฐ, ํ•ธ๋“ค๋ง ํ•จ์ˆ˜์— ์ด๋ฒคํŠธ object๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค. ์ด๋ฒคํŠธ object๋ฅผ ํ™œ์šฉํ•ด์„œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์›์ธ์ด๋‚˜, ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚œ Element์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

onClick, onChange, onKeyDown, onKeyUp, onKeyPress, onDoubleClick, onFocus, onBlur, onSubmit ๋“ฑ์˜ DOM ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋‹ค.

 

2. ์ปดํฌ๋„ŒํŠธ ๋‚ด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

2-1. DOM Input ๊ฐ’์„ State์— ์ €์žฅํ•˜๊ธฐ

const App = () => {
	const [inputValue, setInputValue] = useState("defaultValue");
    
    const handleChange = (event) => {
    	setInputValue(event.target.value);
    }
    
    return (
    	<div>
        	<input onChange={handleChange} defalutValue={inputValue} />
            <br />
            ์ž…๋ ฅํ•œ ๊ฐ’์€: {inputValue}
        </div>
    );
}

event object์˜ target์€ ์ด๋ฒคํŠธ์˜ ์›์ธ์ด ๋˜๋Š” Element๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ event์˜ target์€ input element์ด๋ฏ€๋กœ, ์ž…๋ ฅ๋œ value๋ฅผ ๊ฐ€์ ธ์™€์„œ setState๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค.

2-2. ์—ฌ๋Ÿฌ Input ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ

const App = () => {
	const [user, setUser] = useState({ name: "๋ฏผ์ˆ˜", school: "์—˜๋ฆฌ์Šค๋Œ€ํ•™๊ต" });
    
    const handleChange = (event) => {
    	const { name, value } = event.target;
        const newUser = { ...user };
        newUser[name] = value;
        setUser(newUser);
    };
    
    return (
    	<div>
        	<input name="name" onChange={handleChange} value={user.name} />
            <br />
            <input name="school" onChange={handleChange} value={user.school} />
            <p>
            	{user.name}๋‹˜์€ {user.school}์— ์žฌํ•™์ค‘์ž…๋‹ˆ๋‹ค.
            </p>
        </div>
    );
};

target์œผ๋กœ๋ถ€ํ„ฐ name์„ ๋ฐ›์•„์™€์„œ, ํ•ด๋‹น name์˜ key์— ํ•ด๋‹นํ•˜๋Š” value๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ state์— ๋ฐ˜์˜ํ•œ๋‹ค.

 

3. ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋ฒคํŠธ ์ „๋‹ฌ

3-1. ์ปดํฌ๋„ŒํŠธ๊ฐ„ ์ด๋ฒคํŠธ ์ „๋‹ฌํ•˜๊ธฐ

const MyForm = ({ onChange }) => {
	return (
    	<div>
        	<span>์ด๋ฆ„: </span>
            <input onChange={onChange} />
        </div>
    );
}

// ----------------------------------------------------

const App = () => {
	const [username, setUsername] = useState('');
    return (
    	<div>
        	<h1>{username}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.</h1>
            <MyForm onChange={(event) => {
            	setUsername(event.target.value);
            }}/>
        </div>
    );
}

์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ •๋ณด๋ฅผ ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹Œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์œ„์™€ ๊ฐ™์ด ์ด๋ฒคํŠธ๋ฅผ Props๋กœ ์ „๋‹ฌํ•ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

3-2. ์ปค์Šคํ…€ ์ด๋ฒคํŠธ

const SOS = ({ onSOS }) => {
	const [count, setCount] = useState(0);
    
    const handleClick = () => {
    	if(count >= 2) {
        	onSOS();
        }
        setCount(count + 1);
    }
    return (
    	<button onCLick={handleClick}>์„ธ ๋ฒˆ ๋ˆ„๋ฅด๋ฉด ๊ธด๊ธ‰ํ˜ธ์ถœ({count})</button>
    );
}

// ---------------------------------------------

const App = () => {
	return (
    	<div>
        	<SOS onSOS={() => { alert('๊ธด๊ธ‰์‚ฌํƒœ!') }}/>
        </div>
    );
}

๋‹จ์ˆœํžˆ DOM ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ ๋‚˜๋งŒ์˜ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

3-3. ์ด๋ฒคํŠธ ๋ช…๋ช…๋ฒ•

์ง์ ‘ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ์—๋Š” ์ด๋ฆ„์„ ์ž์œ ๋กญ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต์€ ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก "on" + ๋™์‚ฌ ๋˜๋Š” "on" + ๋ช…์‚ฌ + ๋™์‚ฌ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

์˜ˆ) onClick, onButtonClick, onInputChange
ํ•ธ๋“ค๋ง ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ โžก "handle" + ๋™์‚ฌ ๋˜๋Š” "handle" + ๋ช…์‚ฌ + ๋™์‚ฌ