• ✏️ React의 useContext

    2024. 2. 8.

    by. 서카츄

     

     

    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

     

    '📚 이론정리 > React & Next.js' 카테고리의 다른 글

    ✏️ Optimistic Update  (0) 2024.02.18
    ✏️ Lazy-loading  (0) 2024.02.18
    ✏️ React의 useSearchParams  (0) 2024.01.31
    ✏️ React의 Router 사용하기, react-router-dom  (0) 2024.01.30
    ✏️ React의 Link, useNavigate  (1) 2024.01.29

    댓글