보통 부모 컴포넌트 -> 자식 컴포넌트로 props를 전달한다.
엄청 큰 App이 있을 때 컴포넌트들이 공통으로 필요로 하는 데이터가 있다면
(ex. 현재 로그인 중인 사용자, 테마)
일일이 단계별로 props를 전달한다는건 너무 귀찮은일이다.
예를 들어 C와 E가 Data를 필요로 할 때 부모인 A, B, D는 필요하지않은 데이터를 전달받아 자식에게 전달해줘야하는 문제가 생긴다.
리액트는 이 문제를 해결할 수 있는 Context를 제공한다.
어떤 컴포넌트든 useContext를 사용하면 부모에게서 props로 전달 전달 받지않고도 데이터를 바로 사용할 수 있다.
props drilling을 피하기 위한 목적이라면 Component Composition(컴포넌트 합성)을 먼저 고려하도록 권장한다.
테마 정보를 위한 Context와 사용자 정보를 전달하기위한 context를 context 폴더에 생성해준다.
import { createContext } from 'react';
export const ThemeContext = createContext(null);
import { createContext } from 'react';
export const UserContext = createContext(null);
import { useState } from 'react';
import './App.css';
import Page from './components/Page';
import { ThemeContext } from './context/ThemeContext';
import { UserContext } from './context/UserContext';
function App() {
const [isDark, setIsDark] = useState(false);
return (
<UserContext.Provider value={'사용자'}>
// {}로 감싸서 object 생성후 value로 전달
<ThemeContext.Provider value={{ isDark, setIsDark}}>
<Page />
</ThemeContext.Provider>
</UserContext.Provider>
);
}
export default App;
import { createContext } from 'react';
export const AbcContext = createContext(null);
import { AbcContext } from './context/ThemeContext';
...
<AbcContext.Provider value={전달값}>
// ....
</AbcContext.Provider>
...
import { AbcContext } from '../context/AbcContext';
...
const abc = useContext(AbcContext);
...