FrontEnd/React

Lifting State Up

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

 

Shared State

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

하나의 데이터를 여러 개의 컴포넌트에서 표현

 

 

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

물의 끓음 여부를 나타내는 컴포넌트를 만들어 보자

 

import { useState } from "react";

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

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>
    )
}

 

입력 컴포넌트 추출하기

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} />
            celsius={parseFloat(temperature)} />
        </fieldset>
    )
}

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

 

온도 변환 함수 작성하기

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

tryConvert('abc', toCelsius);       // empty string을 리턴
tryConvert('10.22', toFahrenheit)   // '50.396'을 리턴

 

Shared State 적용하기

function TemperatureInput(props) {
   ...
    return (
            // 변경 전 : <input value={temperature}onChange={handleChange} />
            <input value={props.temperature}onChange={handleChange} />
   ...
    )
}

const handleChange = (event) => {
        // 변경 전 : setTemperature(event.target.value);
        props.onTemperatureChange(event.target.value);
    }
    
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>
    )
}

 

Calculator 컴포넌트 변경하기

function Calculator(props) {
    const [temperature, setTemperatrue] = useState('');
    const [scale, setScale] = useState('c');

    const handleCelsiusChange = (temperature) => {
        setTemperatrue(temperature);
        setScale('c');
    }

    const handleFahrenheitChange = (temperature) => {
        setTemperatrue(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>
    )
}

 

소플님의 강의 자료 이미지


 

 

 

인프런 - 처음 만난 리액트(React)

 

[지금 무료] 처음 만난 리액트(React) | Inje Lee (소플) - 인프런

Inje Lee (소플) | 자바스크립트와 CSS 기초 문법과 함께 리액트의 기초를 탄탄하게 다질 수 있습니다., 깔끔한 강의자료, 꼼꼼한 설명으로쉽게 배우는 리액트 강의입니다. 👨‍🏫 리액트의 세계로

www.inflearn.com

 

https://ko.legacy.reactjs.org/docs/lifting-state-up.html

 

State 끌어올리기 – React

A JavaScript library for building user interfaces

ko.legacy.reactjs.org

 

https://react.dev/learn/sharing-state-between-components

 

Sharing State Between Components – React

The library for web and native user interfaces

react.dev

 

https://github.com/soaple/first-met-react-practice/tree/master/src/chapter_12

 

first-met-react-practice/src/chapter_12 at master · soaple/first-met-react-practice

소플의 처음 만난 리액트 실습 소스코드. Contribute to soaple/first-met-react-practice development by creating an account on GitHub.

github.com

 

'FrontEnd > React' 카테고리의 다른 글

Context  (0) 2024.04.30
Composition vs Inheritacne  (0) 2024.04.29
Forms  (0) 2024.04.23
Lists and Keys  (0) 2024.04.22
Conditional Rendering  (0) 2024.04.19