[React] 04. ์ด๋ฒคํธ ํธ๋ค๋ง
- -
๐ ์ด๋ฒคํธ ํธ๋ค๋ง
์ด๋ฒคํธ(event)๋ ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ์์ DOM ์์๋ค๊ณผ ์ํธ์์ฉํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. 3์ฅ์์ ์ฌ์ฉํ๋ ๋ง์ฐ์ค ํด๋ฆญ์ด๋ ๋ง์ฐ์ค ์ปค์ ์ฌ๋ฆฌ๊ธฐ, ์ ๋ ฅ ๋ฑ๋ฑ์ด ์ด๋ฒคํธ์ ์์์ ๋๋ค.
html์ alert์ ๊ฐ์ด ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ์์ ์ํธ์์ฉํ๋ ๊ฒ์ด ์ด๋ฒคํธ(event)์ ๋๋ค. ๋ฆฌ์กํธ์ ์ด๋ฒคํธ๋ ์์ JavaScript ํน์ jQuery๋ฅผ ์ฌ์ฉํ ์น ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ฒคํธ๋ฅผ ๋ค๋ฃจ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ๊ธฐ์กด HTML DOM Event๋ฅผ ์๊ณ ์๋ค๋ฉด ๋ฆฌ์กํธ์ ์ปดํฌ๋ํธ๋ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์์ ๊ฒ์ ๋๋ค. ํด๋์คํ ์ปดํฌ๋ํธ์ ํจ์ํ ์ปดํฌ๋ํธ์์ ์ด๋ฒคํธ๋ฅผ ๋ค๋ฃจ๋๋ก ํฉ์๋ค
๐ I. ๋ฆฌ์กํธ ์ด๋ฒคํธ ์์คํ
๐ 1. ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์์ฌํญ
1. ์ด๋ฒคํธ ์ด๋ฆ์ ์นด๋ฉ ํ๊ธฐ๋ฒ์ผ๋ก ์์ฑํฉ๋๋ค.
- HTML์ onclick์ ๋ฆฌ์กํธ์์ onClick์ผ๋ก ์์ฑ
- onekeyup์ onKeyUp์ผ๋ก ์์ฑ
2. ์ด๋ฒคํธ์ ์คํํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด ์๋ ํจ์ ํํ์ ๊ฐ์ ์ ๋ฌ
- HTML์์๋ ์ด๋ฒคํธ๋ฅผ ์ค์ ํ ๋ ํฐ๋ฐ์ดํ ์์ ์คํํ ์ฝ๋๋ฅผ ๋ฃ์
- ๋ฆฌ์กํธ์์๋ ํจ์ ํํ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ
- ํ์ดํ ํจ์ ๋ฌธ๋ฒ ์ฒ๋ผ ๋ฐ๋ก ๋ง๋ค์ด์ ์ ๋ฌํด๋ ๋๊ณ , ๋ ๋๋ง ๋ถ๋ถ ์ธ๋ถ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ์ ๋ฌํด๋ ๊ฐ๋ฅ
3. DOM ์์์๋ง ์ด๋ฒคํธ๋ฅผ ์ค์ ํ ์ ์์
- div, button, input, form, span ๋ฑ์ DOM ์์์๋ ์ด๋ฒคํธ๋ฅผ ์ค์ ํ ์ ์์
- ๊ทธ๋ฌ๋ ์์ ์ด ์ง์ ๋ง๋ ์ปดํฌ๋ํธ์๋ ์ด๋ฒคํธ๋ฅผ ์์ฒด์ ์ผ๋ก ์ค์ ํ ์ ์์
- ์ ๋ฌ๋ฐ์ props๋ฅผ ์ปดํฌ๋ํธ ๋ด๋ถ์ DOM ์ด๋ฒคํธ๋ก ์ค์ ํ ์๋ ์์
๐ 2. ์ด๋ฒคํธ ์ข ๋ฅ
๋ฆฌ์กํธ์์ ์ง์ํ๋ ์ด๋ฒคํธ ์ข ๋ฅ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ฆฌ์กํธ ๋ฉ๋ด์ผ(https://facebook.github.io/react/docs/event.html)์ ์ฐธ๊ณ ํ์ฌ ์ด๋ฒคํธ๋ค์ ๋ํ ์์ธํ ์ค๋ช ๋ค์ ๋ณผ ์ ์์ต๋๋ค.
- Clipboard
- Keyboard
- Form
- Selection
- UI
- Media
- Animation
- Image
- Wheel
- Touch
- Mouse
- Focus
- Composition
๐ II. ์์ ๋ก ์ด๋ฒคํธ ํธ๋ค๋ง ์ตํ๊ธฐ
๐ 1. ์ปดํฌ๋ํธ ์์ฑ ๋ฐ ๋ถ๋ฌ์ค๊ธฐ
์ค์ตํ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ปดํฌ๋ํธ ์์ฑ ๋ฐ ๋ถ๋ฌ์ค๊ธฐ
- onChange ์ด๋ฒคํธ ํธ๋ค๋งํ๊ธฐ
- ์์ ๋ฉ์๋ ๋ง๋ค๊ธฐ
- input ์ฌ๋ฌ๊ฐ ๋ค๋ฃจ๊ธฐ
- onKeyPress ์ด๋ฒคํธ ํธ๋ค๋งํ๊ธฐ
(1) ์ปดํฌ๋ํธ ์์ฑ
src ๋๋ ํฐ๋ฆฌ ๋ด๋ถ์ EventPractice.js ํ์ผ์ ๋ง๋ค์ด ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
render() {
return (
<div>
<h1>์ด๋ฒคํธ ์ฐ์ต</h1>
</div>
);
}
}
export default EventPractice;
(2) App.js์์ EventPractice ๋ ๋๋ง
App ์ปดํฌ๋ํธ์์ EventPractice๋ฅผ ๋ถ๋ฌ์ ๋ ๋๋งํ๋ฉด ์ด๋ฒคํธ ์ฐ์ต ํ๋ฉด์ด ๋ ๋๋ง๋ ํ๋ฉด์ ๋ณผ ์ ์์ต๋๋ค.
// App.js
import EventPractice from "./EventPractice";
const App = () => {
return <EventPractice />;
};
export default App;
๐ 2. onChange ์ด๋ฒคํธ ํธ๋ค๋งํ๊ธฐ
(1) onChange ์ด๋ฒคํธ ์ค์
EventPractice ์ปดํฌ๋ํธ์ input ์์๋ฅผ ๋ ๋๋งํ๋ ์ฝ๋์ ํด๋น ์์์ onChange ์ด๋ฒคํธ๋ฅผ ์ค์ ํ๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
render() {
return (
<div>
<h1>์ด๋ฒคํธ ์ฐ์ต</h1>
<input
type="text"
name="message"
onChange={
(e) => {
console.log(e);
}
}
/>
</div>
);
}
}
export default EventPractice;
์ด๋ฌํ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์น ๋ธ๋ผ์ฐ์ ์์ ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ(F12)์ console์ ์ด์ด ์ธํ์ ์ ๋ ฅํ ์ ์์ต๋๋ค.
- ์ฝ์์ ๊ธฐ๋ก๋๋ e ๊ฐ์ฒด๋ SyntheticEvent๋ก ์น ๋ธ๋ผ์ฐ์ ์ ๋ค์ดํฐ๋ธ ์ด๋ฒคํธ(๋ธ๋ผ์ฐ์ ๊ณ ์ ์ด๋ฒคํธ)๋ฅผ ๊ฐ์ธ๋ ๊ฐ์ฒด
- SyntheticEvent๋ ๋ค์ดํฐ๋ธ ์ด๋ฒคํธ์ ๋ฌ๋ฆฌ ์ด๋ฒคํธ๊ฐ ๋๋๊ณ ์ด๊ธฐํ ๋์ด ์ ๋ณด๋ฅผ ์ฐธ์กฐํ ์ ์์
- ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฒคํธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ผ์ด ์๋ค๋ฉด e.persist( ) ํจ์๋ฅผ ํธ์ถํด์ผํจ
(2) state์ input ๊ฐ ๋ด๊ธฐ
state์ input ๊ฐ์ ๋ด๊ฒ ์ต๋๋ค. ์์ฑ์ ๋ฉ์๋์ธ constructor์์ state ์ด๊น๊ฐ์ ์ค์ ํ๊ณ , ์ด๋ฒคํธ ํธ๋ค๋ง ํจ์ ๋ด๋ถ์์ this.setState ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ state๋ฅผ ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๋ค.
* state์ ๋ํ ๋ด์ฉ์ 3์ฅ(https://jiyesmoon.tistory.com/19)์ ์ฐธ๊ณ ํ์ธ์
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
state = {
message: ""
}
render() {
return (
<div>
<h1>์ด๋ฒคํธ ์ฐ์ต</h1>
<input
type="text"
name="message"
placeholder="์๋ฌด๊ฑฐ๋ ์
๋ ฅํด๋ณด์ธ์"
value={this.state.message}
onChange={
(e) => {
this.setState({
message: e.target.value
})
}
}
/>
</div>
);
}
}
export default EventPractice;
input์ ์๋ฌด๊ฑฐ๋ ์ ๋ ฅํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ์ ๋ด๊ฒจ์ง ๊ฒ์ ๋๋ค.
(3) ๋ฒํผ์ ๋๋ฅผ ๋ comment ๊ฐ์ ๊ณต๋ฐฑ์ผ๋ก ์ค์
input ์์ ์ฝ๋ ์๋ ์ชฝ์ button์ ํ๋ ๋ง๋ค๊ณ , ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํ์ฌcomment ๊ฐ์ ๋ฉ์์ง ๋ฐ์ค๋ก ๋์ด ํ comment ๊ฐ์ ๊ณต๋ฐฑ์ผ๋ก ์ค์ ํฉ๋๋ค. alert๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ message ๊ฐ์ ํ๋ฉด์ ํ์ํฉ๋๋ค.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
state = {
message: ""
}
render() {
return (
<div>
<h1>์ด๋ฒคํธ ์ฐ์ต</h1>
( ... )
<button onClick={
() => {
alert(this.state.message);
this.setState({
message: ""
});
}
}>ํ์ธ</button>
</div>
);
}
}
export default EventPractice;
๐ 3. ์์ ๋ฉ์๋ ๋ง๋ค๊ธฐ
(1) ๊ธฐ๋ณธ ๋ฐฉ์
์์ ๋ฆฌ์กํธ ์ด๋ฒคํธ ์ฌ์ฉ์ ์ฃผ์์ฌํญ 1๋ฒ์์ ํจ์ ํํ์ ๊ฐ์ฒด ๊ฐ์ ์ ๋ฌํ๋ค๊ณ ๋ฐฐ์ ์ต๋๋ค. ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ ๋๋ง ํ๋ ๋์์ ํจ์๋ฅผ ์์ฑํ ์๋ ์์ง๋ง, ํจ์๋ฅผ ๋ฏธ๋ฆฌ ์ค๋นํ์ฌ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. onChange์ onClick์ ์ ๋ฌํ ํจ์๋ฅผ ๋ฐ๋ก ๋นผ๋ด์ ์ปดํฌ๋ํธ ์์ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
state = {
message: ""
}
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.handleClick = this.handleClick.bind(this);
}
handleChange(e) {
this.setState({
message: e.target.value
});
}
handleClick() {
alert(this.state.message);
this.setState({
message: ""
});
}
render() {
return (
<div>
<h1>์ด๋ฒคํธ ์ฐ์ต</h1>
<input
type="text"
name="message"
placeholder="์๋ฌด๊ฑฐ๋ ์
๋ ฅํด๋ณด์ธ์"
value={this.state.message}
onChange={this.handleChange}
/>
<button onClick={this.handleClick}>ํ์ธ</button>
</div>
);
}
}
export default EventPractice;
- ํจ์๊ฐ ํธ์ถ๋ ๋ this๋ ํธ์ถ๋ถ์ ๋ฐ๋ผ ๊ฒฐ์
- ํด๋์ค์ ์์ ๋ฉ์๋๊ฐ ํน์ HTML ์์์ ์ด๋ฒคํธ๋ก ๋ฑ๋ก๋๋ ๊ณผ์ ์์ ๋ฉ์๋์ this์ ๊ด๊ณ๊ฐ ๋์ด์ง
- ์์ ๋ฉ์๋๊ฐ ์ด๋ฒคํธ๋ก ๋ฑ๋ก๋์ด๋ this๋ฅผ ์ปดํฌ๋ํธ ์์ ์ผ๋ก ์ ๋๋ก ๊ฐ๋ฆฌํค๊ธฐ ์ํด์๋ ๋ฉ์๋๋ฅผ this์ ๋ฐ์ธ๋ฉํ๋ ์์ ์ด ํ์
- ๋ฐ์ธ๋ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด this๊ฐ undefined๋ฅผ ๊ฐ๋ฆฌํด
- ์ ์ฝ๋์์๋ constructor ํจ์์์ ํจ์๋ฅผ ๋ฐ์ธ๋ฉํ๋ ์์ ์ ํจ
(2) Property Initializer Syntax๋ฅผ ์ฌ์ฉํ ๋ฉ์๋ ์์ฑ
๊ธฐ๋ณธ ์์ ์ ์ ๋ฉ์๋๋ฅผ ๋ง๋ค ๋ ๋ง๋ค constructor๋ฅผ ์์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ถํธํฉ๋๋ค. ์ด ์์ ์ ๊ฐ๋จํ๊ฒ ํ๋ ค๋ฉด ๋ฐ๋ฒจ์ transfor-class-properties ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ํ์ดํ ํจ์ ํํ๋ก ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
state = {
message: ""
}
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.handleClick = this.handleClick.bind(this);
}
handleChange = (e) => {
this.setState({
message: e.target.value
});
}
handleClick = () => {
alert(this.state.message);
this.setState({
message: ""
});
}
render() {
return (
<div>
<h1>์ด๋ฒคํธ ์ฐ์ต</h1>
<input
type="text"
name="message"
placeholder="์๋ฌด๊ฑฐ๋ ์
๋ ฅํด๋ณด์ธ์"
value={this.state.message}
onChange={this.handleChange}
/>
<button onClick={this.handleClick}>ํ์ธ</button>
</div>
);
}
}
export default EventPractice;
๐ 4. input ์ฌ๋ฌ ๊ฐ ๋ค๋ฃจ๊ธฐ
(1) input ์ฌ๋ฌ ๊ฐ ๋ค๋ฃจ๊ธฐ
input์ด ์ฌ๋ฌ ๊ฐ์ผ ๋๋ event ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ e.target.name์ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. onChange ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ e.target.name์ ํด๋น input์ name์ ๊ฐ๋ฆฌํต๋๋ค.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
state = {
username: "",
message: ""
}
handleChange = (e) => {
this.setState({
[e.target.name]: e.target.value
});
}
handleClick = () => {
alert(this.state.username + ":" + this.state.message);
this.setState({
username: "",
message: ""
});
}
render() {
return (
<div>
<h1>์ด๋ฒคํธ ์ฐ์ต</h1>
<input
type="text"
name="username"
placeholder="์ฌ์ฉ์๋ช
"
value={this.state.username}
onChange={this.handleChange}
/>
<input
type="text"
name="message"
placeholder="์๋ฌด๊ฑฐ๋ ์
๋ ฅํด ๋ณด์ธ์"
value={this.state.message}
onChange={this.handleChange}
/>
<button onClick={this.handleClick}>ํ์ธ</button>
</div>
);
}
}
export default EventPractice;
- e.target.name์ ํด๋น ์ธํ์ name์ ๊ฐ๋ฆฌํค๋ฏ๋ก ํ์ฌ ์ฝ๋์์๋ message
- render ํจ์์์ name ๊ฐ์ด username์ธ input์ ๋ ๋๋ง
- state ์ชฝ์๋ username์ด๋ผ๋ ๊ฐ์ด ์ถ๊ฐ
๐ 5. onKeyPress ์ด๋ฒคํธ ํธ๋ค๋ง
(1) onKeyPress ์ด๋ฒคํธ ํธ๋ค๋ง
ํค๋ฅผ ๋๋ ์ ๋ ๋ฐ์ํ๋ KeyPress ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. comment ์ธํ์์ ์ํฐ๋ฅผ ๋๋ ์ ๋ handleClick ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ก ํ๋ ์ฝ๋์ ๋๋ค.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
state = {
username: "",
message: ""
}
handleChange = (e) => {
this.setState({
[e.target.name]: e.target.value
});
}
handleClick = () => {
alert(this.state.username + ":" + this.state.message);
this.setState({
username: "",
message: ""
});
}
handleKeyPress = (e) => {
if(e.key === 'Enter') {
this.handleClick();
}
}
render() {
return (
<div>
<h1>์ด๋ฒคํธ ์ฐ์ต</h1>
<input
type="text"
name="username"
placeholder="์ฌ์ฉ์๋ช
"
value={this.state.username}
onChange={this.handleChange}
/>
<input
type="text"
name="message"
placeholder="์๋ฌด๊ฑฐ๋ ์
๋ ฅํด ๋ณด์ธ์"
value={this.state.message}
onChange={this.handleChange}
onKeyPress={this.handleKeyPress}
/>
<button onClick={this.handleClick}>ํ์ธ</button>
</div>
);
}
}
export default EventPractice;
๐ III. ํจ์ ์ปดํฌ๋ํธ๋ก ๊ตฌํํ๊ธฐ
๐ 1. ํจ์ ์ปดํฌ๋ํธ๋ก ๊ตฌํ
๊ธฐ์กด์ ํด๋์คํ ์ปดํฌ๋ํธ๋ก ๊ตฌํ๋ ๊ฒ์ ํจ์ํ ์ปดํฌ๋ํธ๋ก๋ ์ ์ธํ ์ ์์ต๋๋ค.
// EventPractice.js
import {useState} from 'react';
const EventPractice = () => {
const [username, setUsername] = useState('');
const [message, setMessage] = useState('');
const onChangeUsername = e => setUsername(e.target.value);
const onChangeMessage = e => setMessage(e.target.value);
const onClick = () => {
alert(username + ':' + message);
setUsername('');
setMessage('');
};
const onKeyPress = e => {
if (e.key === 'Enter') {
onClick();
}
};
return (
<div>
<h1>์ด๋ฒคํธ ์ฐ์ต</h1>
<input
type="text"
name="username"
placeholder="์ฌ์ฉ์๋ช
"
value={username}
onChange={onChangeUsername}
/>
<input
type="text"
name="message"
placeholder="์๋ฌด๊ฑฐ๋ ์
๋ ฅํด๋ณด์ธ์"
value={message}
onChange={onChangeMessage}
onKeyPress = {onKeyPress}
/>
<button onClick={onClick}>ํ์ธ</button>
</div>
);
};
export default EventPractice;
- e.target.name์ ํ์ฉํ์ง ์๊ณ onChange ๊ด๋ จ๋ ํจ์๋ฅผ ๋ฐ๋ก ๋ ๊ฐ ๋ง๋ฆ
- ์ธํ์ ๊ฐ์๊ฐ ๋ง์์ง์ง ์๋๋ค๋ฉด e.target.name์ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ๋ก ํจ์๋ฅผ ์์ฑํด๋ ๋จ
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] # ํด๋์คํ ์ปดํฌ๋ํธ VS ํจ์ํ ์ปดํฌ๋ํธ (0) | 2022.10.09 |
---|---|
[React] 03. ์ปดํฌ๋ํธ (1) | 2022.10.04 |
[React] 02. JSX (0) | 2022.09.26 |
[React] # ๋ฆฌ์กํธ ํ๋ก์ ํธ ๋ง๋ค๊ธฐ (0) | 2022.09.25 |
[React] 01. ๋ฆฌ์กํธ ์์ (1) | 2022.09.24 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค