리액트에서 일반적으로 부모컴포넌트 > 자식컴포넌트로 데이터를 전달해줄때 props로 전달해주었다
그런데 만약
부모 > 자식 > 그자식 그 자식의 자식 ....*100 이라면???
- 컴포넌트에서 prop 을 사용하지 않고 자식에게 전달만 하는 경우도 있다
여기서 바로 prop drilling이 일어나게 된다.
- 깊이가 너무 깊어지면 prop이 어떤 컴포넌트에서 전해져 왔는지 모를수 있다.
- 컴포넌트에서 오류가 발생했을때 어떤컴포넌트에서 오류가 발생했는지 추적하는데 오래걸린다.

그러면 이런 문제점을 contextAPI로 해결해보자
- useContext hook 을 통해서 전역데이터를 관리 할수 있다.
- 여기서 App.jsx전체를 묶을수도 있고, 컴포넌트들끼리도 묶을수 있겠다.
context : 문맥, 맥락
특정 영역 안에서 context (상태)를 공유하여서 사용할수 있다.
contextAPI 필수 개념
- createContext : context생성
- useContext : context를 구독하고 해당 context의 값을 읽는다.
- provider : context를 하위 컴포넌트에게 전달해준다
사용법
당연히 props로 넘겨주고 받아오는 코드들은 필요없다.
1. context폴더 안에 globalContext.jsx파일을 생성한다 (jsx파일명은 context를 써야하니 ~~Context로 써주자.)
createContext()로 Context생성
- value 를 객체로(키,벨류) 넣어준다 : (상태들을)
import React, { createContext } from "react";
export const GlobalContext = createContext(null);
//여기서 null은 기본값
//export로 내보내줘서 다른곳에서 쓸수있게 함
export function GlobalProvider ({children}) {
//하위 컴포넌트들이 쓸 state모두 기입
const [a, setA] = useState("");
const [b, setB] = useState("");
<GlobalContext.Provider value={{ a:a, b:b }}>
{children}
</GlobalContext.Provider>
}
2. 상위컴포넌트 (ex.App.jsx) 를 GlobalProvider로 감싸준다. (안에 있는 컴포넌트들은 globalContext 내부 맥락을 유지한다라는 의미)
import GlobalProvider from './GlobalContext'; // 만든 Context 가져오기
const ParentComponent = () => {
return (
<GlobalProvider>
<ChildComponent />
</GlobalProvider>
);
}
3.useContext() : state를 쓰고싶은 컴포넌트에서 불러와준다
const data = useContext(GlobalContext)
useContext(아까 생성한컴포넌트 명)
<p>{data.a}</p>
https://github.com/hyerin-kang/Pokemon-dex/issues/4
Context API로 리팩터링 및 최종 스타일링 · Issue #4 · hyerin-kang/Pokemon-dex
Context API 적용 : contextAPI로 관리하여 prop drilling 없애고 전역 상태 관리 구현 스타일링, 디버깅 : ui맞추기, 대시보드 스타일링 context 상태관리를 이용하여 구현한 branch (context)
github.com
실제 미니프로젝트에서 적용해보았따! (의외로 간-단)
하지만 contextAPI는 만능이 아니다.
provider 에서 제공하는 value가 달라지면 useContext를 사용하는 모든 컴포넌트가 리랜더링되는 문제가 또 있다..
그래서 value를 쓸때 주의해서 써야한다!
이문제는 메모이제이션에서 해소 할수 있다.. (다음편에 계~속!)
'React' 카테고리의 다른 글
| Tanstack Query (0) | 2025.02.24 |
|---|---|
| React 조건부 렌더링을 활용한 로그인/회원가입 폼 리팩토링 (0) | 2025.02.21 |
| useEffect와 라이프사이클 (0) | 2025.02.03 |
| 메달리스트 업데이트 해주기(feat.map,상태업데이트) (0) | 2025.01.25 |
| React 소개와 설치 (3) | 2025.01.20 |