08_Oct_2021 ๐Ÿฐ์—˜๋ฆฌ์Šค AI ํŠธ๋ž™ TIL: React II ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

์œ ํ™˜์ตยท2021๋…„ 10์›” 8์ผ
0

์ด๋ฒคํŠธ ์†Œ๊ฐœ

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

Element๊ฐ€ ๋กœ๋”ฉ๋˜์—ˆ์„ ๋•Œ, ์‚ฌ์šฉ์ž๊ฐ€ Element๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜, ๋”๋ธ” ํด๋ฆญ ๋“ฑ๊ณผ ๊ฐ™์€ ํ–‰๋™์„ ํ–ˆ์„ ๋•Œ ๋“ฑ, ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋‹ค.

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถœ๋ ฅํ•˜์—ฌ ์•Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

ํ•ธ๋“ค๋ง ํ•จ์ˆ˜ ์„ ์–ธ

const App = () => {
   const handleClick = () => {
	alert('clicked');
   }
   return (
    <div>
    	<button onClick={handleClick}>ํด๋ฆญํ•˜์„ธ์š”</button>	
    </div>
   );
};

์ต๋ช… ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌ

const App = () => {
    return (
    	<div>
            <button onClick={()=>{ alert('ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค.')}>
            ํด๋ฆญํ•˜์„ธ์š”</button>
        </div>
    )
}

React์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
๋ณ„๋„์˜ ํ•ธ๋“ค๋ง ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  Element์— ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ๋ฒ•๊ณผ
์ด๋ฒคํŠธ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด๋ฒคํŠธ ๊ฐ์ฒด

const App = () => {
	const handleChange = (event) => {
    	console.log(event.target.value + '๋ผ๊ณ  ์ž…๋ ฅ');
    }
    return (
    	<div>
           <input onChange={handleChange}/>
        </div>
    );
}
  • DOM Element์˜ ๊ฒฝ์šฐ ํ•ธ๋“ค๋ง ํ•จ์ˆ˜์— ์ด๋ฒคํŠธ object๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  • ์ด๋ฒคํŠธ object๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์›์ธ, ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚œ Element์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ฒคํŠธ ํ˜•ํƒœ(ํด๋ฆญ, ํ‚ค ์ž…๋ ฅ ๋“ฑ)์™€ DOM ์ข…๋ฅ˜(button, form, input ๋“ฑ)์— ๋”ฐ๋ผ ์ „๋‹ฌ๋˜๋Š” ์ด๋ฒคํŠธ object์˜ ๋‚ด์šฉ๋„ ๋‹ค๋ฅด๋‹ˆ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

๋งŽ์ด ์“ฐ์ด๋Š” DOM ์ด๋ฒคํŠธ

  • onClick : element๋ฅผ ํด๋ฆญ
  • onChange: element์˜ value๊ฐ€ ๋ณ€๊ฒฝ๋จ
  • onKeyDown, onKeyUp, onKeyPress: ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์ด ์ผ์–ด๋‚จ
  • onDoubleClick: element๋ฅผ ๋”๋ธ” ํด๋ฆญ
  • onFocus: element์— focus ๋จ
  • onBlur: element๊ฐ€ focus๋ฅผ ์žƒ์Œ
  • onSubmit: form element์—์„œ submit ํ–ˆ์„ ๋•Œ

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

DOM ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ

const App = () => {
   const handleClick = () => {
       alert('ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค.');
   }
   return (
   	<div>
  		<button onClick={handleClick}>ํด๋ฆญํ•˜์„ธ์š”</button>
	</div>
   );
}

DOM element์˜ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ด๋‹ค.

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

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

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

์—ฌ๋Ÿฌ 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>
    );
};

State๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ object๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ input์„ state๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.
target์œผ๋กœ๋ถ€ํ„ฐ name์„ ๋ฐ›์•„์™€ ํ•ด๋‹น name์˜ key์— ํ•ด๋‹นํ•˜๋Š” value๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ state์— ๋ฐ˜์˜ํ•œ๋‹ค.

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

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

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)=> {event.target.value)}}/>
        </div>
    );
}

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

์ปค์Šคํ…€ ์ด๋ฒคํŠธ

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 ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

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

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

ํ•ธ๋“ค๋ง ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ handle+๋™์‚ฌ ํ˜น์€ handle+๋ช…์‚ฌ+๋™์‚ฌ์˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ฉฐ, 'handle'๋Œ€์‹  ์ด๋ฒคํŠธ ๋ช…๊ณผ ๋™์ผํ•œ 'on'์„ ์•ž์— ๋ถ™์—ฌ๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

profile
์‚ฌ์šฉ์ž์˜ ํŽธ์˜๋ฅผ ๋” ์ƒ๊ฐํ•˜๊ณ  ํŽธ์•ˆํ•œ UI/UX ๊ฐœ๋ฐœ์„ ๊ฟˆ๊พธ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ง€๋ง์ƒ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€