Lifting State Up

tintwo·2022년 12월 15일
0

이번엔 여러개의 component들 사이의 state공유에 대해 알아보자.

Shared State

state에 있는 데이터를 여러개의 하위 컴포넌트에서 공통적으로 사용하는 경우를 말한다.
보통 가장 가까운 부모 component state를 공유해 사용한다.

state 공유 예제

// 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;
// Calculator.jsx ( 상위 부모 컴포넌트 )
import React, { useState } from "react";
import TemperatureInput from "./TemperatureInput";
// 하위 컴포넌트 import

function BoilingVerdict(props) { // 조건부 렌더링 celsius가 100 이상 => 물이 끓는다
    if(props.celsius >= 100) {
        return <p>물이 끓습니다.</p>
    }
    return <p>물이 끓지 않습니다.</p>
}

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)) { // number가 아닐 시 공백 return
        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;

react에서 code를 효율적으로 작성 하려면, 컴포넌트를 작게 나누고, 재사용 가능한 형태로 개발 하는게 좋다.

profile
study records of beginner developer

0개의 댓글