You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Context를 사용하는 이유는 Props Drilling 문제를 해결하기 위해서 이다. Props Drilling란 원하는 목적지까지 데이터를 전달하기 위해서는 경로상에 있는 모든 컴포넌트에 일일이 Props를 전달해야한다. Props를 전달하는 과정이 마치 드릴로 땅을 파고 내려가는 것과 같다고 하여 Props Drilling 문제라고 한다.
Props Drilling는 컴포넌트 사이의 데이터 교환 구조를 파악하기 어렵게 만들고, Props를 수정하게 되면 그것을 공유하는 여러 컴포넌트를 모두 살펴 봐야해서 코드의 유지 보수를 어렵게 한다.
리액트에서 Context는 같은 문맥 아래에 있는 컴포넌트 그룹에 데이터를 공급하는 기능에 사용된다. Context를 이용하면 단계마다 일일이 Props를 전달하지 않고도 컴포넌트 트리 전역에 데이터를 공급할 수 있어 Props Drilling 문제를 간단히 해결할 수 있다.
ContextAPI
리액트의 Context API 를 사용하면, 프로젝트 안에서 전역적으로 사용 할 수 있는 값을 관리 할 수 있다. 또한, ContextAPI는 context를 만들고 다루는 리액트 기능이다.
constMyContext=React.createContext(defalutValue);
위와 같이 React.createContext를 이용하면 Context를 생성할 수 있다.
Context에서 데이터를 공급하려면 Context.Provider 기능을 사용해야 한다.
ⓐ MyContext.Provider를 App 컴포넌트의 자식으로 배치하여 Provider가 설정한 자식, 자손 컴포넌트들은 MyContext로 묶여 이 객체에서 공급하는 데이터를 사용할 수 있다. Provider 컴포넌트에 Props(value)를 전달해 MyContext가 공급할 값을 설정한다.
Provider 컴포넌트는 Props로 공급할 데이터를 받아 컴포넌트 트리에서 자신보다 하위에 있는 모든 컴포넌트에 데이터를 공급한다.
Context를 만들면, Context 안에 Provider 라는 컴포넌트가 들어있는데 이 컴포넌트를 통하여 Context 의 값을 정할 수 있다. 이 컴포넌트를 사용할 때, value 라는 값을 설정해주면 된다. 즉, Context Provider를 통한 데이터 공급하는 것이다.
contextAPI는 Provider의 value값을 props로 내려주는 것이 아니고 하위 컴포넌트인 HomePage와 AboutPage가 AppContext.Provider를 구독(subscribe)하고 있기 때문에 AppContext.Provider의 value 값이 변경되면 하위 컴포넌트들이 상태가 자동으로 변경된다.
이렇게 작동하는 이유는 React의 Context API가 구독-발행(subscribe-publish) 모델을 사용하기 때문이다.
Provider 컴포넌트는 context 값을 "발행(publish)"하는 역할을 합니다.
하위 컴포넌트에서 useContext 훅을 사용하면 해당 context를 "구독(subscribe)"하게 됩니다.
Provider의 value prop 값이 변경되면, 구독 중인 하위 컴포넌트들에게 새로운 값이 자동으로 전파되어 반영됩니다.