์ƒˆ์†Œ์‹

React

[React] 04. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง

  • -

์ด๋ฒคํŠธ(event)๋ž€ ์‚ฌ์šฉ์ž๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ DOM ์š”์†Œ๋“ค๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 3์žฅ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๋งˆ์šฐ์Šค ํด๋ฆญ์ด๋‚˜ ๋งˆ์šฐ์Šค ์ปค์„œ ์˜ฌ๋ฆฌ๊ธฐ, ์ž…๋ ฅ ๋“ฑ๋“ฑ์ด ์ด๋ฒคํŠธ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

html์˜ alert์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์ด ์ด๋ฒคํŠธ(event)์ž…๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ์˜ ์ด๋ฒคํŠธ๋Š” ์ˆœ์ˆ˜ JavaScript ํ˜น์€ jQuery๋ฅผ ์‚ฌ์šฉํ•œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด HTML DOM Event๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋„ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฃจ๋„๋ก ํ•ฉ์‹œ๋‹ค

 


๐Ÿ“š 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

์‹ค์Šตํ•  ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ๋ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
  2. onChange ์ด๋ฒคํŠธ ํ•ธ๋“ค๋งํ•˜๊ธฐ
  3. ์ž„์˜ ๋ฉ”์„œ๋“œ ๋งŒ๋“ค๊ธฐ
  4. input ์—ฌ๋Ÿฌ๊ฐœ ๋‹ค๋ฃจ๊ธฐ
  5. 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;

(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;

(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;

(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์ด๋ผ๋Š” ๊ฐ’์ด ์ถ”๊ฐ€

(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;

๊ธฐ์กด์˜ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„๋œ ๊ฒƒ์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ๋„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// 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์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋”ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋„ ๋จ

 

 

 

Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.