단계마다 일일이 props를 넘겨주지 않고도 컴포넌트 트리 전체에 데이터를 제공할 수 있게해주는 것
일반적인 React Project에서 데이터는 위에서 아래로 (즉, 부모로부터 자식에게) props를 통해 전달이됨
그러나 프로젝트 규모가 커질경우 props의 경우 이 과정이 번거로울 수 있음
이럴 때 context를 이용하면, 트리 단계마다 명시적으로 props를 넘겨주지 않아도 많은 컴포넌트가 이러한 값을 공유하도록 할 수 있음
단, Context를 사용하면 컴포넌트를 재사용하기 어려워 질 수 있기 때문에 꼭 필요할 때만 사용하는 것이 좋음. Prop drilling 을 피하기 위한 목적이라면 Component Composition (컴포넌트 합성) 을 먼저 고려해 보는 것이 좋음.
cf. Prop Drilling
props를 오로지 하위 컴포넌트로 전달하는 용도로만 쓰이는 컴포넌트들을 거치면서 React Component 트리의 한 부분에서 다른 부분으로 데이터를 전달하는 과정임.
function App() {
return <GrandParent value="Hello World!" />;
}
function GrandParent({ value }) {
return <Parent value={value} />;
}
function Parent({ value }) {
return <Child value={value} />;
}
function Child({ value }) {
return <GrandChild value={value} />;
}
function GrandChild({ value }) {
return <Message value={value} />;
}
function Message({ value }) {
return <div>Received: {value}</div>;
}
cf. 컴포넌트 합성이란? - 여러 개의 컴포넌트를 합쳐서 새로운 컴포넌트를 만드는 것
Context 객체를 만듦
const MyContext = React.createContext(defaultValue);
defaultValue 는 적절한 provider를 찾지 못했을 때 쓰이는 값임 (해당 store가 어떠한 provider에 할당되지 않은 경우)
Context.Provider
Provider는 정의한 context를 하위 컴포넌트들에게 전달하는 역할을 함.
<MyStore.Provider value={this.state}>
<subComponent1 />
<subComponent2 />
</MyStore.Provider>
subComponent1과 subComponent2는 Context의 상태를 사용할 수 있음
1) Context.Consumer 로 Context 접근하기
Context 변화를 구독하는 컴포넌트임, 상위 provider가 없다면 createContext() 에서 정의한 defaultValue를 가짐
<MyContext.Consumer>
{value => /* context 값을 이용한 렌더링 */}
</MyContext.Consumer>
import { useContext } from 'react';
function MyComponent() {
const value = useContext(Context);
return <span>{value}</span>;
}
Context API 실제 적용 / Context API의 문제점 / Redux 와의 차이점 / 정확히 어떤 경우에 써야 하는 건지??
Context API 의 문제점 -> 렌더링 이슈 : Context 값이 변경될 때 모든 자식 컴포넌트들이 리렌더링되는 이슈 -> memoization 연산밖에는 리렌더링을 방어할 방도가 없음
Context API 는 상태 관리 도구가 아님. 전역적으로 상태를 공유해주는 기능만 수행
하지만 Redux는 상태 관리 도구로 상태를 관리해줌 (추가로 Redux 는 리렌더링 관련 이슈도 최적화를 해줌)
즉, Context 로 Redux, Zustand, Recoil 등 상태 관리 도구를 대체할 순 없음
참고자료
https://ko.reactjs.org/docs/context.html
https://www.youtube.com/watch?v=LwvXVEHS638
https://dev-yakuza.posstree.com/ko/react/context-api/
https://www.youtube.com/watch?v=JQ_lksQFgNw&t=246s