prop drilling
을 해야만 하기 때문이다. (cf. Props drilling: 중첩된 여러 계층의 컴포넌트들에게 props를 전달해 주는 것)createContext
메서드를 사용하여 context 생성한다.Provider
로 대상 컴포넌트를 감싼다.Provider
의 프로퍼티인 value
에 전달할 데이터를 넣는다.Provider
의 value
에 담은 데이터를 전달 할 때는, 2가지 방식으로 전달이 가능하다. Consumer
컴포넌트 또는 useContext
라는 훅을 이용하는 법이다.4-1. 기본 예제 코드 - Consumer 컴포넌트를 사용하는 방법
import { createContext } from ‘react’;
export const themeContext = createContext(전달할 데이터의 초기값);
export default function App() {
return (
<themeContext.Provider value={전달할 데이터}>
<Theme />
</themeContext.Provider>
)
}
function Theme() {
return (
<themeContext.Consumer>
{value => <div>{value}</div>}
</themeContext.Consumer>
)
}
4-2. 기본 예제 코드 - useContext() Hook을 사용하는 방법
(리액트 hook이 도입된 16.8 버전부터 사용 가능하게 된 방법)
import { createContext, useContext } from ‘react’;
export const themeContext = createContext(전달할 데이터의 초기값);
export default function App() {
return (
<themeContext.Provider value={전달 데이터}>
<Theme />
</themeContext.Provider>
)
}
function Theme() {
const theme = useContext(themeContext);
return <div>{theme}</div> // Provider에서 value로 전달한 데이터 출력
}
import React, { createContext, useContext } from 'react';
import './style.css';
const themeDefault = { border: '10px solid red' };
const themeContext = createContext(themeDefault);
export default function App() {
const theme = useContext(themeContext);
return (
<themeContext.Provider value={{ border: '10px solid blue' }}>
<div className="root" style={theme}>
<h1>Hello World</h1>
<Sub1 />
</div>
</themeContext.Provider>
);
}
function Sub1() {
const theme = useContext(themeContext);
return (
<themeContext.Provider value={{ border: '10px solid green' }}>
<div style={theme}>
<h1>Sub1</h1>
<Sub2 />
</div>
</themeContext.Provider>
);
}
function Sub2() {
const theme = useContext(themeContext);
return (
<div style={theme}>
<h1>Sub2</h1>
<Sub3 />
</div>
);
}
function Sub3() {
const theme = useContext(themeContext);
return (
<div style={theme}>
<h1>Sub3</h1>
</div>
);
}
Reference.