SOITZ

React Context API 사용하기

Published on

React의 Context API는 전역적으로 데이터를 공유할 수 있는 방법을 제공합니다. 이를 통해 prop-drilling(하위 컴포넌트에게 props를 계속 전달하는 것) 문제를 해결할 수 있습니다.

먼저, 색상을 저장하고 변경할 수 있는 Context를 생성합니다. 그 다음, 이 Context를 사용하는 Provider 컴포넌트를 만들고, 이를 애플리케이션의 상위에서 사용합니다. 마지막으로, Context에서 색상을 읽고 변경하는 컴포넌트를 만들어서 Provider 컴포넌트의 하위에 배치합니다.

1. Context 생성

먼저, color 값을 저장할 Context를 만듭니다. 이 Context는 공유하고자 하는 데이터와 그 데이터를 업데이트하는 함수를 포함합니다.

// ColorContext.tsx
'use client';

import { createContext, useContext, useState } from 'react';

export type Color = 'white' | 'black';

interface ColorContextProps {
  color: 'white' | 'black';
  setColor: (color: Color) => void;
}

export const ColorContext = createContext<ColorContextProps>({
  color: 'white', // 기본값
  setColor: () => {}, // 빈 함수
});

export const ColorProvider = ({ children }: { children: React.ReactNode }) => {
  const [color, setColor] = useState<Color>('white');
  return (
    <ColorContext.Provider value={{ color, setColor }}>
      {children}
    </ColorContext.Provider>
  );
};

export const useColor = () => useContext(ColorContext);

2. Provider를 사용하여 컴포넌트 감싸기

ColorProvider를 사용하여 상태를 사용할 ColorComponent를 감싸줍니다.

// App.tsx
import ColorComponent from './ColorComponent';
import { ColorProvider } from './ColorContext';

export default function App() {
  return (
    <ColorProvider>
      <ColorComponent />
    </ColorProvider>
  );
}

3. Color 상태를 사용하는 컴포넌트 만들기

ColorComponent를 만들고 useColor 훅을 사용하여 color 상태를 읽고 변경할 수 있습니다.

// ColorComponent.tsx
'use client';

import { useColor } from './ColorContext';

export default function ColorComponent() {
  const { color, setColor } = useColor();

  return (
    <div>
      <p>Current color: {color}</p>
      <div className="mt-10 flex gap-x-2">
        <button
          onClick={() => setColor('black')}
          className="border border-gray-600 p-2"
        >
          Change to Black
        </button>
        <button
          onClick={() => setColor('white')}
          className="border border-gray-600 p-2"
        >
          Change to White
        </button>
      </div>
    </div>
  );
}

Context를 사용하지만 매번 사용방법을 잊게 되어서 이렇게 글을 작성해 봅니다.