๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
Front
11-React-Event

1. HTML์˜ Event

  • ์ด๋ฒคํŠธ(event) : ์‚ฌ์šฉ์ž๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ DOM ์š”์†Œ๋“ค๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ
    • e.g. ๋ฒ„ํŠผ์— ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ์˜ฌ๋ ธ์„ ๋•Œ๋Š” onmouseover์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰
    • e.g. ํด๋ฆญํ–ˆ์„ ๋•Œ๋Š” onclick์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰
    • e.g. Form์š”์†Œ๋Š” ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ onchange์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰
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์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
function Form() {
2
// ์—ฌ๊ธฐ์„œ e๋Š” ํ•ฉ์„ฑ ์ด๋ฒคํŠธ
3
function handleSubmit(e) {
4
e.preventDefault()
5
console.log('You clicked submit.')
6
}
7
8
return (
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โ€ ์ƒํƒœ๋ฅผ ํ† ๊ธ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

1
class Toggle extends React.Component {
2
constructor(props) {
3
super(props)
4
this.state = { isToggleOn: true }
5
6
// ์ฝœ๋ฐฑ์—์„œ `this`๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”์ธ๋”ฉ ํ•ด์ฃผ์–ด์•ผ ํ•จ
7
this.handleClick = this.handleClick.bind(this)
8
}
9
10
handleClick() {
11
this.setState(prevState => ({
12
isToggleOn: !prevState.isToggleOn,
13
}))
14
}
15
16
render() {
17
return <button onClick={this.handleClick}>{this.state.isToggleOn ? 'ON' : 'OFF'}</button>
18
}
19
}
20
21
const root = ReactDOM.createRoot(document.getElementById('root'))
22
root.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์˜ ์ด๋ฒคํŠธ๋“ค์€ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„์—์„œ ํ˜ธ์ถœ๋จ


4. ์˜ˆ์‹œ

  • ์บก์ฒ˜๋ง = ๋ถ€๋ชจ ์š”์†Œ์˜ ์–ด๋–ค ์ž์‹์ด ๋ถˆ๋ €๋Š”์ง€ ์ฒดํฌํ•จ
  • ๋ฒ„๋ธ”๋ง = ์ž์‹ ์š”์†Œ๊ฐ€ ๋ถ€๋ชจ ์š”์†Œ์— ๋ถˆ๋ €๋Š”์ง€ ์ฒดํฌํ•จ
    • ์บก์ฒ˜๋ง ์ดํ›„์— ์ˆ˜ํ–‰
    • ์บก์ฒ˜๋ง ๋‹จ๊ณ„์—์„œ ์“ฐ๊ณ  ์‹ถ์œผ๋ฉดโ€ฆ
      • ์ฆ‰, ์ž์‹์ด ๋ถ€๋ชจ๋ณด๋‹ค ๋จผ์ € ์ธ์‹๋˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋–„ ์‚ฌ์šฉ
1
export default function Event() {
2
const handleClick = e => {
3
console.log('๋ฒ„ํŠผ ๋ˆŒ๋ €๋„ค?๐Ÿคก - ์„ธ๋ฒˆ์จฐ ํ˜ธ์ถœ')
4
}
5
6
const handleClickCapture = e => {
7
console.log('handleClickCapture ๋ฒ„ํŠผ๐Ÿ‘ฝ - ์ฒซ๋ฒˆ์จฐ ํ˜ธ์ถœ')
8
}
9
10
const handleClickCapture2 = e => {
11
console.log('handleClickCapture2 ๋ฒ„ํŠผ๐Ÿคช - ๋‘๋ฒˆ์จฐ ํ˜ธ์ถœ')
12
}
13
14
const handleClickBubble = () => {
15
console.log('handleClickBubble ๋ฒ„ํŠผ๐Ÿ˜ซ - ๋„ค๋ฒˆ์จฐ ํ˜ธ์ถœ')
16
}
17
18
return (
19
<div onClickCapture={handleClickCapture}>
20
<div onClickCapture={handleClickCapture2} onClick={handleClickBubble}>
21
<button onClick={handleClick}>Button</button>
22
</div>
23
</div>
24
)
25
}

[์ฐธ๊ณ ]