Post

๐ŸŒŒ React ์ž…๋ฌธ โ…จ - Event

๐ŸŒŒ React ์ž…๋ฌธ โ…จ - Event

๐Ÿ“˜ ใ€Ž์†Œํ”Œ์˜ ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธใ€๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

Event ์ฒ˜๋ฆฌ

1
2
3
4
5
// DOM
<button onclick="activate()">Activate</button>

// ๋ฆฌ์•กํŠธ
<button onClick={activate}>Activate</button>
  • DOM์—๋„ React์—๋„ Event๊ฐ€ ์žˆ์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค.
  • Event๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๋‹น Event๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์„ Event Handler ๋˜๋Š” Event Listener๋ผ๊ณ  ํ•œ๋‹ค.

โœ… Class Component์˜ Event ์ฒ˜๋ฆฌ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Toggle extends React.Component {
	constructor(props) {
    	super(props);
        
        this.state = { isToggleOn : true };
        this.handleClick = this.handleClick.bind(this);
    }
    
    handleClick() {
    	this.setState(prevState => ({
        	isToggleOn : !prevState.isToggleOn
        }));
    }
    
    render() {
    	return (
            <button onClick={this.handleClick}>
            	{this.state.isToggleOn ? '์ผœ์ง' : '๊บผ์ง'}
            </button>
        );
    }
}
  • Class Component๋Š”ย ๊ธฐ๋ณธ์ ์œผ๋กœ Binding ๋˜์ง€ ์•Š๋Š”๋‹ค.ย 
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ Bind ํ•˜์ง€ ์•Š์œผ๋ฉดย this.handleClick์€ Global Scope์—์„œ ํ˜ธ์ถœ๋˜์ง€๋งŒ, Global Scope์—์„œ ํ•ด๋‹น ๊ฐ’์€ย undefined์ด๋ฏ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜์˜ ์ด๋ฆ„ ๋’ค์— ๊ด„ํ˜ธ ์—†์ด ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ Bind ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ์•„๋‹ˆ๋ผ๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
class MyButton extends React.Component {
	handleClick () {
		console.log('this is:', this);
	}
	
	rendor() {
		return (
			<button onClick={() => this.handleClick()}>
				ํด๋ฆญ
			</button>
		);
	}
}
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ์ข…์†๋œ Instance๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.ย 

โœ… Functional Component์˜ Event ์ฒ˜๋ฆฌ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function Toggle(props) {
    const [isToggleOn, setIsToggleOn] = useState(true);
    
    // ํ•จ์ˆ˜ ์•ˆ์˜ ํ•จ์ˆ˜
    function handleClick() {
    	setIsToggleOn((isToggleOn) => !isToggleOn);
    }
    
    // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
    /*
    const handleClick = () => {
    	setIsToggleOn((isToggleOn) => !isToggleOn);
    }
    */
    
    return (
    	<button onClick={handleClick}>
            {isToggleOn ? '์ผœ์ง' : '๊บผ์ง'}
        </button>
    );
}
  • ์ƒ๊ธฐ ์ฝ”๋“œ๋Š” ์œ„์˜ย Toggleย Class Component๋ฅผ Functional Component๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ์ด๋ฉฐ, 1๋ฒˆ ๋ฐฉ์‹๊ณผ 2๋ฒˆ ๋ฐฉ์‹ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.ย 

Arguments

1
2
3
4
5
6
7
8
9
function myButton(props) {
    const handleDelete = (id, event) => {
    	console.log(id, event.target);	
    }
    
    return (
    	<button onClick={(event) => handleDelete(1, event)}>์‚ญ์ œํ•˜๊ธฐ</button>
    );
}
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋ฐฉ์‹์œผ๋กœ handleDelete() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ id์™€ event๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ๋‹ค.

์‹ค์Šต

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import { useState } from "react";

function ConfirmButton(props) {
	const [isConfirmed, setIsConfirmed] = useState(false);
	const handleConfirm = () => {
		setIsConfirmed((prevIsConfirmed) => !prevIsConfirmed);
	};
	const buttonStyle = {
		padding: "10px 20px",
		backgroundColor: isConfirmed ? "#aaa" : "#007BFF",
		color: "white",
		border: "none",
		borderRadius: "4px",
		fontSize: "14px",
		cursor: isConfirmed ? "not-allowed" : "pointer",
		transition: "background-color 0.3s ease",
		marginTop: "20px",
		marginLeft: "20px",
	};
	
	return (
		<button onClick={handleConfirm} disabled={isConfirmed} style={buttonStyle}>
			{isConfirmed ? '์ธ์ฆ์™„๋ฃŒ' : '์ธ์ฆ'}
		</button>
	);
}

export default ConfirmButton;

ํšŒ๊ณ 

  • ์‹ค์Šต ์˜ˆ์ œ๋ฅผ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•ด๋ณด๋ฉฐ ์ด๋ฉ”์ผ ์ธ์ฆ ๋ฒ„ํŠผ ๋“ฑ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๊ณ  ์ถฉ๋ถ„ํžˆ ์žฌ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅํ•œ Component๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.