context를 이용하면 단계마다 일일이 props를 넘겨주지 않고도 컴포넌트 트리 전체에 데이터를 제공할 수 있습니다.
일반적인 React 애플리케이션에서 데이터는 위에서 아래로 (즉, 부모로부터 자식에게) props를 통해 전달되지만, 애플리케이션 안의 여러 컴포넌트들에 전해줘야 하는 props의 경우 (예를 들면 선호 로케일, UI 테마) 이 과정이 번거로울 수 있습니다. context를 이용하면, 트리 단계마다 명시적으로 props를 넘겨주지 않아도 많은 컴포넌트가 이러한 값을 공유하도록 할 수 있습니다.
React 공식 문서 - Context 발췌.
React 공식 문서에 따르면, 데이터를 Props로 넘기는 대신, 간편하게 데이터를 컴포넌트 전체에 제공할 수 있는 기능이라고 한다. 한번 예시를 들어 알아보자.
// store/auth-context.js
import React from 'react';
const AuthContext = React.createContext({
isLoggedIn: false,
onLogout: () => {},
onLogin: (email, password) => {},
});
export default AuthContext;
// store/auth-context.js
export const AuthContextProvider = (props) => {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const logoutHandler = () => {
localStorage.setItem('isLoggedIn', '0');
setIsLoggedIn(false);
}
const loginHandler = () => {
localStorage.setItem('isLoggedIn', '1');
setIsLoggedIn(true);
}
return (
<AuthContext.Provider
value={{
isLoggedIn: isLoggedIn,
onLogout: logoutHandler,
onLogin: loginHandler,
}}>
{props.children}
</AuthContext.Provider>
);
}
// index.js
import { AuthContextProvider } from './components/store/auth-context';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<AuthContextProvider>
<App />
</AuthContextProvider>
);
const Navigation = (props) => {
const context = useContext(AuthContext);
...
return (
...
{context.isLoggedIn && ( // context의 boolean값에 접근하였다.
<li>
<a href="/">Users</a>
</li>
)}
{context.isLoggedIn && (
// 값 뿐만이 아니라, Context는 함수도 제공해줄 수 있다.
<button onClick={context.onLogout}>Logout</button>
)}
);
context의 주된 용도는 다양한 레벨에 네스팅된 많은 컴포넌트에게 데이터를 전달하는 것입니다. context를 사용하면 컴포넌트를 재사용하기가 어려워지므로 꼭 필요할 때만 쓰세요.
React 공식 문서 - Context 발췌.