์ด๋ฒคํธ๋ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ค์ฃผ๋ 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>
);
}
- onClick : element๋ฅผ ํด๋ฆญ
- onChange: element์ value๊ฐ ๋ณ๊ฒฝ๋จ
- onKeyDown, onKeyUp, onKeyPress: ํค๋ณด๋ ์ ๋ ฅ์ด ์ผ์ด๋จ
- onDoubleClick: element๋ฅผ ๋๋ธ ํด๋ฆญ
- onFocus: element์ focus ๋จ
- onBlur: element๊ฐ focus๋ฅผ ์์
- onSubmit: form element์์ submit ํ์ ๋
const App = () => { const handleClick = () => { alert('ํด๋ฆญํ์ต๋๋ค.'); } return ( <div> <button onClick={handleClick}>ํด๋ฆญํ์ธ์</button> </div> ); }
DOM element์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ฐ๋จํ ์์ด๋ค.
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๋ฅผ ํ๋ ๋ชจ์ต.
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'์ ์์ ๋ถ์ฌ๋ ๋ฌด๋ฐฉํ๋ค.