[React] props.children, 상태 끌어올리기, state의 기준과 위치

suno·2022년 12월 7일
0
post-custom-banner

커스텀 컴포넌트의 children

<MyComponent></MyComponent>
커스텀 컴포넌트 사이의 JSX 요소들이 props.children으로 전달된다.

<MyComponent>텍스트</MyComponent>
위와 같이 사용하는 경우 MyComponent의 props.children === '텍스트'가 된다.

Passing Props to a Component




상태 끌어올리기 (lifting state up)

React는 단방향 데이터 흐름이라는 원칙에 따라 상위 컴포넌트 → 하위 컴포넌트로 데이터가 전달되어야 함.
하위 컴포넌트에서는 상위 컴포넌트의 데이터를 변경할 수 없음.

하위 컴포넌트에서 상위 컴포넌트 값을 변경하고 싶다면? 상태 끌어올리기를 사용하자.

상태 끌어올리기란? 상위 컴포넌트에 useState로 상태를 설정해주고 하위 컴포넌트에는 setState 함수를 전달해주는 것이다.
이렇게 하면 하위 컴포넌트에서는 데이터에 직접 접근하지 않고도 setState 함수를 통해 상위 컴포넌트의 데이터를 변경할 수 있다.

Counter

위와 같이 상위 컴포넌트 AppCounterCounter라는 하위 컴포넌트 두개가 있는 경우를 생각해보자.
각각 버튼을 클릭하면 AppCounter 내부의 count 값이 증가되고, 상위 컴포넌트는 totalCount 값을 가지고 있다.

하위 → 상위 컴포넌트로 데이터가 변경되는 흐름은 단방향 흐름에 맞지 않다.
Counter 컴포넌트의 props로 setTotalCount를 직접 넘겨주어서, 하위 컴포넌트에서 totalCount 상태를 변경할 수 있게 한다.

import { useState } from 'react';
import './App.css';
import Counter from './components/Counter';

export default function AppCounter() {
  const [totalCount, setTotalCount] = useState(0);

  return (
    <div className='container'>
      <div className='banner'>
        Total Count: {totalCount} {totalCount > 10 ? '🔥' : '❄️'}
      </div>
      <div className='counters'>
        <Counter total={totalCount} setTotalCount={setTotalCount} />
        <Counter total={totalCount} setTotalCount={setTotalCount} />
      </div>
    </div>
  );
}

REACT 상태 끌어올리기(LiftingStateUp)

React 단방향 데이터 흐름
1. 유지보수가 편함
2. Virtual DOM Tree 비교 렌더링이 효율적임. 부모→자식 한방향으로 흐르기 때문.
[React]데이터 흐름




State로 관리해야 하는 기준

  1. 부모로부터 props를 통해 전달되는가?
    👉 그렇다면 state가 아님

  2. 시간이 지나도 변하지 않는가?
    👉 그렇다면 state가 아님

  3. 컴포넌트 안의 다른 state나 props를 가지고 계산이 가능한가?
    👉 그렇다면 state가 아님




State의 위치

  • 특정 컴포넌트 내에서만 유의미하다면 해당 컴포넌트에 위치시킨다.
  • 서로 다른 두 개 이상의 컴포넌트가 특정 state에 의존할 경우, 공통의 상위 컴포넌트에 state를 위치시킨다. (상태 끌어올리기)
profile
Software Engineer 🍊
post-custom-banner

0개의 댓글