[week_08] React ๊ธฐ์ด โ ก (1) ์ด๋ฒคํธ
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" + ๋ช ์ฌ + ๋์ฌ