Post

๐ŸŒŒ React ์ž…๋ฌธ Xโ…ข - Component ๊ฐ„ State ๊ณต์œ 

๐ŸŒŒ React ์ž…๋ฌธ Xโ…ข - Component ๊ฐ„ State ๊ณต์œ 

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

Component ๊ฐ„ State ๊ณต์œ ๋ž€?

  • ์–ด๋–ค Component์˜ State๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ Component์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์‹ค์Šต

1
2
3
Calculator.jsx
โ”œโ”€โ”€ BoilingVerdict.jsx
โ””โ”€โ”€ TemperatureInput.jsx
  • ์‹ค์Šต ์˜ˆ์ œ ๊ตฌ์กฐ์ด๋‹ค.
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Calculator.jsx
import React, { useState } from "react";
import BoilingVerdict from "./BoilingVerdict";
import TemperatureInput from "./TemperatureInput";

function toCelsius(fahrenheit) {
	return ((fahrenheit - 32) * 5) / 9;
}

function toFahrenheit(celsius) {
	return (celsius * 9) / 5 + 32;
}

function tryConvert(temperature, convert) {
	const input = parseFloat(temperature);
	if (Number.isNaN(input)) {
		return '';
	}
	
	const output = convert(input);
	const rounded = Math.round(output * 1000) / 1000;
	return rounded.toString();
}

function Calculator(props) {
	const [temperature, setTemperature] = useState('');
	const [scale, setScale] = useState('c');
	
	const handleCelsiusChange = (temperature) => {
	setTemperature(temperature);
		setScale('c');
	};
	
	const handleFahrenheitChange = (temperature) => {
		setTemperature(temperature);
		setScale('f');
	};
	
	const celsius = scale === 'f' ? tryConvert(temperature, toCelsius) : temperature;
	const fahrenheit = scale === 'c' ? tryConvert(temperature, toFahrenheit) : temperature;
	
	return (
		<div>
			<TemperatureInput
				scale="c"
				temperature={celsius}
				onTemperatureChange={handleCelsiusChange}
			/>
			<TemperatureInput
				scale="f"
				temperature={fahrenheit}
				onTemperatureChange={handleFahrenheitChange}
			/>
			<BoilingVerdict celsius={parseFloat(celsius)}/>
		</div>
	);
}

export default Calculator;

// BoilingVerdict.jsx
import React from "react";

function BoilingVerdict(props){
	if (props.celsius >=100){
		return <p>๋ฌผ์ด ๋“์Šต๋‹ˆ๋‹ค.</p>
	}
	
	return <p>๋ฌผ์ด ๋“์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>
}

export default BoilingVerdict;

// TemperatureInput.jsx
const scaleNames = {
	c : '์„ญ์”จ',
	f : 'ํ™”์”จ'
};

function TemperatureInput(props) {
	const handleChange = (event) => {
		props.onTemperatureChange(event.target.value);
	}
	
	return (
		<fieldset>
			<legend>
				์˜จ๋„๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.(๋‹จ์œ„:{scaleNames[props.scale]})
			</legend>
			<input value={props.temperature} onChange={handleChange}/>
		</fieldset>
	);
}

export default TemperatureInput;
  • ๋ถ€๋ชจ Component์—๊ฒŒ์„œ ์ „๋‹ฌ๋œ props.onTemperatureChange ์†์„ฑ์„ ํ†ตํ•ด ๋ถ€๋ชจ Component์— ์˜ํ–ฅ์„ ์ฃผ๊ณ  ์žˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜์œ„ Component์˜ย State๋ฅผ ๊ณตํ†ต๋œ ๋ถ€๋ชจ Component๋กœ ๋Œ์–ด์˜ฌ๋ ค์„œ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹์„ย Stateย ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ๋ผ๊ณ  ํ•œ๋‹ค.

ํšŒ๊ณ 

  • ๊ณตํ†ต State๋ฅผ ๋ถ€๋ชจ Component์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.
  • ๊ผญ React๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ์–ด๋–ค ์˜์—ญ์ด๋“  ๊ณตํ†ต์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋‹ค.
This post is licensed under CC BY 4.0 by the author.