1. HTML์ Event
์ด๋ฒคํธ(event): ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ์์ DOM ์์๋ค๊ณผ ์ํธ ์์ฉํ๋ ๊ฒ- e.g. ๋ฒํผ์ ๋ง์ฐ์ค ์ปค์๋ฅผ ์ฌ๋ ธ์ ๋๋
onmouseover์ด๋ฒคํธ๋ฅผ ์คํ - e.g. ํด๋ฆญํ์ ๋๋
onclick์ด๋ฒคํธ๋ฅผ ์คํ - e.g.
Form์์๋ ๊ฐ์ด ๋ฐ๋ ๋onchange์ด๋ฒคํธ๋ฅผ ์คํ
- e.g. ๋ฒํผ์ ๋ง์ฐ์ค ์ปค์๋ฅผ ์ฌ๋ ธ์ ๋๋
1<!doctype html>2<html>3<head>4<title>Event ์์ </title>5</head>6<body>7<button onclick="alert('๋๋ ๋ค?')">๋๋ฌ๋ณด์ธ์ฉ</button>8</body>9</html>
2. React์ Event
๋ฆฌ์กํธ์ ์ด๋ฒคํธ ์์คํ ์ ์น ๋ธ๋ผ์ฐ์ ์ HTML ์ด๋ฒคํธ์ ์ธํฐํ์ด์ค๊ฐ ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ๋ฒ์ด ๋น์ทํฉ๋๋ค.
2.1 ์ด๋ฒคํธ๋ ์นด๋ฉ ํ๊ธฐ๋ฒ์ผ๋ก ์์ฑ
์๋ฅผ ๋ค์ด, HTML์ ๋ค์๊ณผ ์์ฑ
1<button onclick="activateLasers()">Activate Lasers</button>
React์์๋ ์ด๋ฒคํธ๋ฅผ ์นด๋ฉํ๊ธฐ๋ฒ์ผ๋ก ์์ฑ (HTML์ onclick์ ๋ฆฌ์กํธ์์๋ onClick)
1<button onClick={activateLasers}>Activate Lasers</button>
2.2 preventDefault๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถ
React์์๋ false๋ฅผ ๋ฐํํด๋ ๊ธฐ๋ณธ ๋์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ฐ๋์ preventDefault๋ฅผ ๊ผญ ํธ์ถํด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ผ๋ฐ HTML์์ ํผ์ ์ ์ถํ ๋ ๊ฐ์ง๊ณ ์๋ ๊ธฐ๋ณธ ๋์์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
1<form onsubmit="console.log('You clicked submit.'); return false">2<button type="submit">Submit</button>3</form>
React์์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
1function Form() {2// ์ฌ๊ธฐ์ e๋ ํฉ์ฑ ์ด๋ฒคํธ3function handleSubmit(e) {4e.preventDefault()5console.log('You clicked submit.')6}78return (9<form onSubmit={handleSubmit}>10<button type="submit">Submit</button>11</form>12)13}
์ฌ๊ธฐ์ e๋ ํฉ์ฑ ์ด๋ฒคํธ์
๋๋ค.
React๋ W3C ๋ช
์ธ์ ๋ฐ๋ผ ํฉ์ฑ ์ด๋ฒคํธ๋ฅผ ์ ์ํ๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
React ์ด๋ฒคํธ๋ ๋ธ๋ผ์ฐ์ ๊ณ ์ ์ด๋ฒคํธ์ ์ ํํ ๋์ผํ๊ฒ ๋์ํ์ง๋ ์์ต๋๋ค.
๋ ์์ธํ ์ฌํญ์ ํฉ์ฑ ์ด๋ฒคํธ์ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
React๋ฅผ ์ฌ์ฉํ ๋ DOM ์๋ฆฌ๋จผํธ๊ฐ ์์ฑ๋ ํ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด addEventListener๋ฅผ ํธ์ถํ ํ์๊ฐ ์์ต๋๋ค.
๋์ , ์๋ฆฌ๋จผํธ๊ฐ ์ฒ์ ๋ ๋๋ง๋ ๋ ๋ฆฌ์ค๋๋ฅผ ์ ๊ณตํ๋ฉด ๋ฉ๋๋ค.
ES6 ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ ๋, ์ผ๋ฐ์ ์ธ ํจํด์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํด๋์ค์ ๋ฉ์๋๋ก ๋ง๋๋ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์ Toggle ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์๊ฐ โONโ๊ณผ โOFFโ ์ํ๋ฅผ ํ ๊ธ ํ ์ ์๋ ๋ฒํผ์ ๋ ๋๋งํฉ๋๋ค.
1class Toggle extends React.Component {2constructor(props) {3super(props)4this.state = { isToggleOn: true }56// ์ฝ๋ฐฑ์์ `this`๊ฐ ์๋ํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ๋ฐ์ธ๋ฉ ํด์ฃผ์ด์ผ ํจ7this.handleClick = this.handleClick.bind(this)8}910handleClick() {11this.setState(prevState => ({12isToggleOn: !prevState.isToggleOn,13}))14}1516render() {17return <button onClick={this.handleClick}>{this.state.isToggleOn ? 'ON' : 'OFF'}</button>18}19}2021const root = ReactDOM.createRoot(document.getElementById('root'))22root.render(<Toggle />)
JSX ์ฝ๋ฐฑ ์์์ this์ ์๋ฏธ์ ๋ํด ์ฃผ์ํด์ผ ํฉ๋๋ค.
JavaScript์์ ํด๋์ค ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ธ๋ฉ๋์ด ์์ง ์์ต๋๋ค.
this.handleClick์ ๋ฐ์ธ๋ฉํ์ง ์๊ณ onClick์ ์ ๋ฌํ์๋ค๋ฉด, ํจ์๊ฐ ์ค์ ํธ์ถ๋ ๋ this๋ undefined๊ฐ ๋ฉ๋๋ค.
์ด๊ฑด JS์์ ํจ์๊ฐ ๋์ํ๋ ๋ฐฉ์์ผ๋ก onClick={this.handleClick}๊ณผ ๊ฐ์ด ๋ค์ ()๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ,
ํด๋น ๋ฉ์๋๋ฅผ ๋ฐ์ธ๋ฉ ํด์ผ ํฉ๋๋ค.
2.3 ์ฃผ์์ฌํญ ์ ๋ฆฌ
์ด๋ฒคํธ๋ ์นด๋ฉ ํ๊ธฐ๋ฒ์ผ๋ก ์์ฑ- HTML์ onclick์ ๋ฆฌ์กํธ์์๋ onClick
- React์์๋
false๋ฅผ ๋ฐํํด๋ ๊ธฐ๋ณธ ๋์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.- ๋ฐ๋์
preventDefault๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํด์ผ ํฉ
- ๋ฐ๋์
์ด๋ฒคํธ์ ์คํํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด ์๋๋ผ, ํจ์ ํํ์ ๊ฐ์ ์ ๋ฌ- HTML์์ ์ด๋ฒคํธ๋ฅผ ์ค์ ํ ๋๋ ํฐ๋ฐ์ดํ ์์ ์คํ ์ฝ๋๋ฅผ ๋ฃ์์ง๋ง, ๋ฆฌ์กํธ์์๋ ํจ์ ํํ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ
- ์ ๋ฒํผ ์์ ์๋ ํ์ดํ ํจ์๋ก ํจ์๋ฅผ ๋ง๋ค์ด ์ ๋ฌ
- ์ด๋ ๊ฒ ํจ์๋ฅผ ๋ง๋ค์ด ์ ๋ฌํด๋ ๋๊ณ , ๋ ๋๋ง ๋ถ๋ถ ์ธ๋ถ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ์ ๋ฌํด๋ ๋จ
DOM ์์์๋ง ์ด๋ฒคํธ๋ฅผ ์ค์ ๊ฐ๋ฅdiv, button, input, form, span๋ฑ์ DOM ์์์๋ ์ด๋ฒคํธ๋ฅผ ์ค์ ํ ์ ์์ง๋ง,- ์ง์ ๋ง๋ ์ปดํฌ๋ํธ์๋ ์ด๋ฒคํธ๋ฅผ ์์ฒด์ ์ผ๋ก ์ค์ ํ ์ ์์
์๋ฅผ ๋ค์ด ๋ค์์ฒ๋ผ ์ง์ ๋ง๋ MyComponent์ onClick๊ฐ์ ์ค์ ํ๋ฉด
1<MyComponent onClick={doSomething}/>
MyComponent๋ฅผ ํด๋ฆญํ ๋,doSomethingํจ์๋ฅผ ์คํํ๋ ๊ฒ์ด ์๋๋ผ,- ๊ทธ๋ฅ ์ด๋ฆ์ด
onClick์ธprops๋ฅผMyComponent์๊ฒ ์ ๋ฌํ๋ ๊ฒ์
3. ์ง์ํ๋ ์ด๋ฒคํธ ์ข ๋ฅ
React์ ์ด๋ฒคํธ๋ค์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ๋จ๊ณ์์ ํธ์ถ๋จ
- Clipboard ์ด๋ฒคํธ
- Composition ์ด๋ฒคํธ
- Keyboard ์ด๋ฒคํธ
- Focus ์ด๋ฒคํธ
- Form ์ด๋ฒคํธ
- Generic ์ด๋ฒคํธ
- Mouse ์ด๋ฒคํธ
- Pointer ์ด๋ฒคํธ
- Selection ์ด๋ฒคํธ
- Touch ์ด๋ฒคํธ
- UI ์ด๋ฒคํธ
- Wheel ์ด๋ฒคํธ
- Media ์ด๋ฒคํธ
- Image ์ด๋ฒคํธ
- Animation ์ด๋ฒคํธ
- Transition ์ด๋ฒคํธ
- ๊ธฐํ ์ด๋ฒคํธ
- c.f. React ๊ณต์๋ฌธ์ ํฉ์ฑ์ด๋ฒคํธ(SyntheticEvent)
4. ์์
- ์บก์ฒ๋ง = ๋ถ๋ชจ ์์์ ์ด๋ค ์์์ด ๋ถ๋ ๋์ง ์ฒดํฌํจ
- ๋ฒ๋ธ๋ง = ์์ ์์๊ฐ ๋ถ๋ชจ ์์์ ๋ถ๋ ๋์ง ์ฒดํฌํจ
- ์บก์ฒ๋ง ์ดํ์ ์ํ
- ์บก์ฒ๋ง ๋จ๊ณ์์ ์ฐ๊ณ ์ถ์ผ๋ฉดโฆ
- ์ฆ, ์์์ด ๋ถ๋ชจ๋ณด๋ค ๋จผ์ ์ธ์๋๊ฒ ๋ง๋ค๊ณ ์ถ์ ๋ ์ฌ์ฉ
1export default function Event() {2const handleClick = e => {3console.log('๋ฒํผ ๋๋ ๋ค?๐คก - ์ธ๋ฒ์จฐ ํธ์ถ')4}56const handleClickCapture = e => {7console.log('handleClickCapture ๋ฒํผ๐ฝ - ์ฒซ๋ฒ์จฐ ํธ์ถ')8}910const handleClickCapture2 = e => {11console.log('handleClickCapture2 ๋ฒํผ๐คช - ๋๋ฒ์จฐ ํธ์ถ')12}1314const handleClickBubble = () => {15console.log('handleClickBubble ๋ฒํผ๐ซ - ๋ค๋ฒ์จฐ ํธ์ถ')16}1718return (19<div onClickCapture={handleClickCapture}>20<div onClickCapture={handleClickCapture2} onClick={handleClickBubble}>21<button onClick={handleClick}>Button</button>22</div>23</div>24)25}