React/처음 만난 리액트(react)

Shared State

yooni825 2023. 10. 17. 22:38

Lifting State Up

: 여러 개의 컴포넌트들 사이에서 state를 공유하는 방법

 

Shared State 공유된 state

: state에 있는 데이터를 여러 개의 하위 컴포넌트에서 공통적으로 사용하는 경우

자식 컴포넌트들이 가장 가까운 공통된 부모 컴포넌트의 스테이트를 공유해서 사용하는 것

 

 

하위 컴포넌트에서 state 공유하기

 

1) 물의 끓음 여부를 알려주는 컴포넌트

function BoilingVerdict(props) {
	if (props.celsius >= 100) {
    return <p>물이 끓습니다.</p>;
    }
    return <p>물이 끓지 않습니다. </p>;
}

: 섭씨온도 값을 props로 받아서 물이 끓는지 안 끓는지를 문자열로 출력해주는 컴포넌트

 

 

2) 이 컴포넌트를 실제로 사용하는 부모 컴포넌트

function Calculator(props) {
	const [temperature, setTemperature] = useState('');
	const handleChange = (event) => {
		setTemperature(event.target.value);
		}
		return (
			<fieldset>
				<legend>섭씨 온도를 입력하세요: </legend>
				<input
					value={temperature}
					onChange={handleChange} />
				<BoilingVerdict
					celsius = {parseFloat(temperature)} />
			</fieldset>
			)
}

 

-> Calculator라는 컴포넌트는 state로 온도값을 하나 갖고 있으며 controlled Component 형태로 구현됨

-> state에 있는 온도값은 앞에서 만든 BoilingVerdict 컴포넌트에 Celsius라는 이름의 풀업으로 전달됨

 

3) 입력 컴포넌트 추출하기

: Calculator 컴포넌트 안에 온도를 입력하는 부분을 별도의 컴포넌트로 추출하기 -> 섭씨 온도와 화씨 온도를 각각 따로 입력받을 수 있도록 하여 재사용이 가능한 컴포넌트를 만들어 사용

 

[온도를 입력받기 위한 Temperaturelnput 컴포넌트]

const scaleNames = {
		c : '섭씨',
		f : '화씨'
	};
 	function TemperatureInput(props) {
		const [temperature, setTemperature] = useState('');
		const handleChange = (event) => {
			setTemperature(event.target.value);
		}
		return (
			<fieldset>
				<legend>
				온도를 입력해 주세요 (단위:{scaleNames[props.scale]}):
				</legend>
				<input value ={temperature} onChange={handleChange} />
			</fieldset>
			)
}

 

[추출한 컴포넌트를 사용하도록 Calculator 컴포넌트를 변경했을 때]

function Calculator(props) {
	return (
		<div>
			<TemperatureInput scale="c" />
			<TemperatureInput scale="f" />
		</div>
		);
}

 

4) 온도 변환 함수 작성하기

: 섭씨온도와 화씨온도 값을 동기화시키기 위해서 각각에 대해 변환하는 함수를 작성해야 함

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

 

5) 이 함수를 호출하는 함수 작성

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

	return rounded.toString();
}

-> tryConvert 함수는 온도 값과 변환하는 함수를 파라미터로 받아서 값을 변환시켜 리턴해 주는 함수

 

6) Shared State 적용하기

: 하위 컴포넌트의 state를 공통된 부모 컴포넌트로 끌어올려서 shared state를 적용

*lifting state up : 하위 컴포넌트의 state를 공통 상위 컴포넌트로 올림

//변경 전 : <input value ={temperature} onChange={handleChange} />

<input value={props.temperature} onChange={handleChange} />
  • handleChange함수 변경하기
// 변경 전 : setTemperature(event.target.value);

props.onTemperatureChange(event.target.value);

 

7) Calculator 컴포넌트 변경하기

우선, state로 Temperature와 Scale을 선언하여 온도값과 단위를 각각 저장하도록 함

TemperatureInputComponent를 사용하는 부분에서는 각 단위로 변환된 온도값과 단위를 props로 넣어주었고

값이 변경되었을 때 업데이트하기 위한 함수를 onTemperatureChange에 넣어줌

-> 섭씨온도가 변경되면 단위가 C로 변경되고 화씨온도가 변경되면 단위가 F로 변경됨

'React > 처음 만난 리액트(react)' 카테고리의 다른 글

Composition 방법과 Inheritance  (0) 2023.10.17
(실습) 섭씨온도와 화씨온도 표시하기  (1) 2023.10.17
(실습) 사용자 입력 받기  (0) 2023.10.17
Form과 Controlled Component  (0) 2023.10.17
List와 Key  (1) 2023.10.11