createContext
๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ ๊ณตํ๊ฑฐ๋ ์ฝ์ ์ ์๋ ์ปจํ
์คํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.const SomeContext = createContext(defaultValue)
์ฐธ์กฐ
createContext(defaultValue)
์ปดํฌ๋ํธ ์ธ๋ถ์์
createContext
๋ฅผ ํธ์ถํ์ฌ ์ปจํ
์คํธ๋ฅผ ์์ฑํ์ธ์.import { createContext } from 'react'; const ThemeContext = createContext('light');
๋งค๊ฐ๋ณ์
defaultValue
: ์ปจํ ์คํธ๋ฅผ ์ฝ๋ ์ปดํฌ๋ํธ ์์ ํธ๋ฆฌ์ ์ผ์นํ๋ ์ปจํ ์คํธ provider๊ฐ ์์ ๋ ์ด ์ปจํ ์คํธ๊ฐ ๊ฐ๋๋ก ํ ๊ฐ์ ๋๋ค. ์๋ฏธ ์๋ ๊ธฐ๋ณธ๊ฐ์ด ์๋ค๋ฉดnull
์ ์ง์ ํ์ธ์. ๊ธฐ๋ณธ๊ฐ์ โ๊ฐ์ฅ ๋ง์ง๋ง ์๋จโ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ ์ ์ด๋ฉฐ ์๊ฐ์ด ์ง๋๋ ์ ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
๋ฐํ๊ฐ
createContext
๋ ์ปจํ
์คํธ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.์ปจํ
์คํธ ๊ฐ์ฒด ์์ฒด๋ ์ด๋ ํ ์ ๋ณด๋ ๋ณด์ ํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ์ฝ๊ฑฐ๋ ์ ๊ณตํ ์ ์๋ ์ปจํ
์คํธ๋ฅผ ๋ํ๋
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์์ ์ปดํฌ๋ํธ์์
SomeContext.Provider
๋ฅผ ์ฌ์ฉํด ์ปจํ
์คํธ ๊ฐ์ ์ง์ ํ๊ณ , ํ์ ์ปดํฌ๋ํธ์์ useContext(SomeContext)
๋ฅผ ํธ์ถํด ์ปจํ
์คํธ ๊ฐ์ ์ฝ์ต๋๋ค. ์ปจํ
์คํธ ๊ฐ์ฒด์๋ ๋ช ๊ฐ์ง ์์ฑ์ด ์์ต๋๋ค:SomeContext.Provider
๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ์ ์ปจํ ์คํธ ๊ฐ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
SomeContext.Consumer
๋ ์ปจํ ์คํธ ๊ฐ์ ์ฝ๋ ๋๋ค๋ฅธ ๋ฐฉ๋ฒ์ด๋ฉฐ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
SomeContext.Provider
์ปดํฌ๋ํธ๋ฅผ ์ปจํ
์คํธ provider๋ก ๊ฐ์ธ ๋ด๋ถ์ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ํ ์ด ์ปจํ
์คํธ์ ๊ฐ์ ์ง์ ํ์ธ์:
function App() { const [theme, setTheme] = useState('light'); // ... return ( <ThemeContext.Provider value={theme}> <Page /> </ThemeContext.Provider> ); }
Props
value
: ์ด ๊ฐ์ ํด๋น provider ๋ด์์ ์ด ์ปจํ ์คํธ๋ฅผ ์ฝ๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ ค๋ ๊ฐ์ผ๋ก, ๊น์ด์ ์๊ด์์ด ์ ๋ฌํ ์ ์์ต๋๋ค. ์ปจํ ์คํธ ๊ฐ์ ๋ชจ๋ ํ์ ์ด ๋ ์ ์์ต๋๋ค. provider ๋ด๋ถ์์useContext(SomeContext)
๋ฅผ ํธ์ถํ๋ ์ปดํฌ๋ํธ๋ ๊ทธ ์์ ์๋ ๊ฐ์ฅ ์์ชฝ์ ํด๋นํ๋ ์ปจํ ์คํธ provider์value
๋ฅผ ๋ฐ์ต๋๋ค.
SomeContext.Consumer
useContext
์ด์ ์๋ ์ปจํ
์คํธ๋ฅผ ์ฝ๋ ์ค๋๋ ๋ฐฉ๋ฒ์ด ์์์ต๋๋ค:function Button() { // ๐ก Legacy way (not recommended) return ( <ThemeContext.Consumer> {theme => ( <button className={theme} /> )} </ThemeContext.Consumer> ); }
์ด ์ค๋๋ ๋ฐฉ๋ฒ์ ์ฌ์ ํ ๋์ํ์ง๋ง ์๋ก ์์ฑ๋ ์ฝ๋๋ ๋์
useContext()
๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ
์คํธ๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค:function Button() { // โ Recommended way const theme = useContext(ThemeContext); return <button className={theme} />; }
Props
-
children
: ํจ์์ ๋๋ค. React๋useContext()
์ ๋์ผํ ์๊ณ ๋ฆฌ์ฆ์ ์ํด ๊ฒฐ์ ๋ ํ์ฌ ์ปจํ ์คํธ ๊ฐ์ผ๋ก ์ ๋ฌํ ํจ์๋ฅผ ํธ์ถํ๊ณ , ์ด ํจ์์์ ๋ฐํํ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋๋งํฉ๋๋ค. ๋ํ React๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ปจํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ด ํจ์๋ฅผ ๋ค์ ์คํํ๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ฌ์ฉ๋ฒ
context ์์ฑํ๊ธฐ
์ปจํ
์คํธ๋ ์ปดํฌ๋ํธ๊ฐ ํ๋กํผํฐ๋ฅผ ๋ช
์์ ์ผ๋ก ์ ๋ฌํ์ง ์๊ณ ๋ ์ ๋ณด๋ฅผ ๊น์์ด ์ ๋ฌํ ์ ์๊ฒ ํด์ค๋๋ค.
ํ๋ ์ด์์ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋ ค๋ฉด ์ปดํฌ๋ํธ ์ธ๋ถ์์ createContext๋ฅผ ํธ์ถํ์ธ์.
import { createContext } from 'react'; const ThemeContext = createContext('light'); const AuthContext = createContext(null);
createContext
๋ ์ปจํ
์คํธ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์ปดํฌ๋ํธ๋ ์ปจํ
์คํธ๋ฅผ useContext()
์ ์ ๋ฌํ์ฌ ์ปจํ
์คํธ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค:function Button() { const theme = useContext(ThemeContext); // ... } function Profile() { const currentUser = useContext(AuthContext); // ... }
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๋๋ ๊ฐ์ ์ปจํ
์คํธ๋ฅผ ๋ง๋ค ๋ ์ง์ ํ ๊ธฐ๋ณธ๊ฐ์ด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ๊ฐ์ ์ ๋ ๋ณ๊ฒฝ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ ์์ฒด๋ก๋ ์ ์ฉํ์ง ์์ต๋๋ค.
์ปจํ
์คํธ๊ฐ ์ ์ฉํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ปดํฌ๋ํธ์ ๋ค๋ฅธ ๋์ ๊ฐ์ ์ ๊ณตํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค:
function App() { const [theme, setTheme] = useState('dark'); const [currentUser, setCurrentUser] = useState({ name: 'Taylor' }); // ... return ( <ThemeContext.Provider value={theme}> <AuthContext.Provider value={currentUser}> <Page /> </AuthContext.Provider> </ThemeContext.Provider> ); }
์ด์
Page
์ปดํฌ๋ํธ์ ๊ทธ ์์ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ ์๋ฌด๋ฆฌ ๊น์์ด ๋ค์ด๊ฐ๋๋ผ๋ ์ ๋ฌ๋ ์ปจํ
์คํธ ๊ฐ์ โ๋ฐ๋ผ๋ณด๊ฒโ ๋ฉ๋๋ค. ๋ง์ฝ ์ ๋ฌ๋ ์ปจํ
์คํธ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด, React๋ ์ปจํ
์คํธ๋ฅผ ์ฝ๋ ์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋งํฉ๋๋ค.ํ์ผ์์ ์ปจํ ์คํธ import ๋ฐ exportํ๊ธฐ
์๋ก ๋ค๋ฅธ ํ์ผ์ ์๋ ์ปดํฌ๋ํธ๊ฐ ๋์ผํ ์ปจํ
์คํธ์ ์ก์ธ์คํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข
์ข
์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ปจํ
์คํธ๋ฅผ ๋ณ๋์ ํ์ผ์ ์ ์ธํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋๋ค. ๊ทธ๋ฐ ๋ค์
export
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ์ผ์์ ์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํ ์ ์์ต๋๋ค:// Contexts.js import { createContext } from 'react'; export const ThemeContext = createContext('light'); export const AuthContext = createContext(null);
๋ค๋ฅธ ํ์ผ์์ ์ ์ธ๋ ์ปดํฌ๋ํธ๋
import
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ด ์ปจํ
์คํธ๋ฅผ ์ฝ๊ฑฐ๋ ์ ๊ณตํ ์ ์์ต๋๋ค:// Button.js import { ThemeContext } from './Contexts.js'; function Button() { const theme = useContext(ThemeContext); // ... }
// App.js import { ThemeContext, AuthContext } from './Contexts.js'; function App() { // ... return ( <ThemeContext.Provider value={theme}> <AuthContext.Provider value={currentUser}> <Page /> </AuthContext.Provider> </ThemeContext.Provider> ); }
์ด๋ ์ปดํฌ๋ํธ import ๋ฐ export์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
๋ฌธ์ ํด๊ฒฐ
์ปจํ ์คํธ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๋ค
๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ ๊ธฐ๋ณธ ์ปจํ
์คํธ ๊ฐ์ ์ง์ ํฉ๋๋ค:
const ThemeContext = createContext('light');
์ด ๊ฐ์ ์ ๋ ๋ณํ์ง ์์ต๋๋ค. React๋ ์์์ ์ผ์นํ๋ provider๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ์๋ง ์ด ๊ฐ์ ๋์ฒดํ์ฌ ์ฌ์ฉํฉ๋๋ค.
์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ปจํ
์คํธ๊ฐ ๋ณ๊ฒฝ๋๋๋ก ํ๋ ค๋ฉด ์ปจํ
์คํธ provider์ state๋ฅผ ์ถ๊ฐํ๊ณ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ธ์.