📚 이론정리/React & Next.js

✏️ React의 useContext

서카츄 2024. 2. 8. 17:59

 

 

React를 배우다보니 우리는 많은 전역관리가 있다는 것을 알게 되었다. 

그 중에 기본 React의 Hook인 `useContext`에 대해서 공부를 해보았다.

 

 

 


 

 

먼저 들어가기 전에!

useContext에 대해 이해하려면 `React`에 있는 `Context`개념부터 알고 넘어가보도록 한다.

 

 

Context는 무엇인가?

리액트는 기본적으로 부모 컴포넌트와 자식 컴포넌트로 이루어진 `트리 구조`를 가지고 있다.

부모가 가지고 있는 데이터를 자식에서도 사용하고 싶으면 `props`로 데이터를 넘겨줘야 한다.

하지만 전달해야 하는 데이터가 자식의 자식의 자식에 있으면 코드는 복잡해지고, 계속 `props`로 데이터를 넘겨줘야 한다.

이런 구조를 `props drilling`이라고 하는데, `props drilling`은 이전 포스팅에 정리해둔게 있으니 이 내용에 대해서는 더 깊게 생략!

 

이러한 `props drilling`을 극복하기 위해 나온 개념이 `Context`이다.

`Context`를 사용하면 `props`전달 없이 하위 컴포넌트에서 자유롭게 값을 가져와서 사용할 수 있다.

 

 


 

useContext

context API 필수 개념

`createContext` : context 생성

`ConSumer` : context 변화 감지

`Provider` : context 전달 ( to 하위 컴포넌트)

 

특히 `useContext`를 사용하게 되면 Provider(최상위부모)에서 제공한 value값이 달라진다고 가정하면

`useContext`를 사용하고 있는 모든 컴포넌트가 `리렌더링` 된다.

그래서 항상 `value`값을 신경 써 줘야 한다.

 

 

실행컨텍스트

어떠한 로직이 실행되는 문맥적인 범위를 말한다.

 

 

 

사용법 예시

import { createContext, useState } from "react";

export const ExpenseContext = createContext();

export default function ExpenseProvider({ children }) {
  const [expenses, setExpenses] = useState([
    {
      id: "1",
      month: 2,
      date: "2024-02-02",
      item: "식비",
      amount: 50000,
      description: "회식",
    },
    {
      id: "2",
      month: 1,
      date: "2024-01-02",
      item: "도서",
      amount: 30000,
      description: "미용실",
    },
  ]);
  return (
    <ExpenseContext.Provider value={{ expenses, setExpenses }}>
      {children}
    </ExpenseContext.Provider>
  );
}

 

먼저 `Context`에 있는 내용을 만들어준다.

 

 

 

 

 

    <ExpenseProvider>
      <BrowserRouter>
        <Routes>
          <Route
            path="/"
            element={<Home expenses={expenses} setExpenses={setExpenses} />}
          />
          <Route
            path="/detail/:id"
            element={<Detail expenses={expenses} setExpenses={setExpenses} />}
          />
        </Routes>
      </BrowserRouter>
    </ExpenseProvider>

 

`Context`가 필요한 곳에 주입해준다.

 

 

 

 

 

사용할 컴포넌트

import { useContext } from "react"
import { ExpenseContext } from "../../context"

 

import로 `useContext`를 가져오고,

내보내기 했던 변수명을 가지고온다.

 

 

 

const { expenses, setExpenses } = useContext(ExpenseContext);

 

그리고 사용할 해당 컴포넌트에 사용해주면 끝이다.

 

 

 

 


 

 

props와 props drilling에 대한 이전 포스팅 

 

✏️ React의 props와 props drilling

컴포넌트끼리의 정보교환 방식부모컨포넌트가 자식컴포넌트에게 물려준 데이터  -> 컴포넌트간의 정보 교류 방법임.props는 반드시 위에서 아래 , 부모->자식 방향으로만 흐른다 (단방향)props

seokachu.tistory.com