상태란?

객체지향 프로그래밍(OOP)에서 객체(Object)가 변수로 자신의 상태(state)를 가짐.

프론트엔드에선 동적으로 표현할 수 있는 데이터

상태관리란?

목표한 UI/UX를 구현하기 위해 적절히 상태(데이터)와 그 구조를 정의, 설계하고 상태를 잘 추적하는 일.

좋은 상태관리란?

가장 좋은 상태 관리는 관리할 상태가 없는 것

‘상태’는 잠재적인 사이드 이펙트(Side-Effect)이다.

사이드 이펙트의 증가는 곧 개발의 복잡도로 이어지며, 이를 최소화하는 것이 좋다.

따라서 무작정 상태를 선언하고 관리하며 전역 변수 라이브러리를 남용하는 것이 아닌,

useReducer – React

import { useReducer } from 'react';

function reducer(state, action) {
  if (action.type === 'incremented_age') {
    return {
      age: state.age + 1
    };
  }
  throw Error('Unknown action.');
}

export default function Counter() {
  const [state, dispatch] = useReducer(reducer, { age: 42 });

  return (
    <>
      <button onClick={() => {
        dispatch({ type: 'incremented_age' })
      }}>
        Increment age
      </button>
      <p>Hello! You are {state.age}.</p>
    </>
  );
}
import { createContext, useContext } from 'react';

const ThemeContext = createContext(null);

export default function MyApp() {
  return (
    <ThemeContext.Provider value="dark">
      <Form />
    </ThemeContext.Provider>
  )
}

function Form() {
  return (
    <Panel title="Welcome">
      <Button>Sign up</Button>
      <Button>Log in</Button>
    </Panel>
  );
}

function Panel({ title, children }) {
  const theme = useContext(ThemeContext);
  const className = 'panel-' + theme;
  return (
    <section className={className}>
      <h1>{title}</h1>
      {children}
    </section>
  )
}

function Button({ children }) {
  const theme = useContext(ThemeContext);
  const className = 'button-' + theme;
  return (
    <button className={className}>
      {children}
    </button>
  );
}