useContext
useContext ๋ ์ปดํฌ๋ํธ์์ context๋ฅผ ์ฝ๊ณ ๊ตฌ๋
ํ ์ ์๋ React Hook์
๋๋ค.
const value = useContext(SomeContext)๋ ํผ๋ฐ์ค
useContext(SomeContext)
useContext ๋ฅผ ์ปดํฌ๋ํธ์ ์ต์์ ์์ค์์ ํธ์ถํ์ฌ context๋ฅผ ์ฝ๊ณ ๊ตฌ๋
ํฉ๋๋ค.
import { useContext } from 'react';
function MyComponent() {
const theme = useContext(ThemeContext);
// ...์๋์์ ๋ ๋ง์ ์์๋ฅผ ํ์ธํด๋ณด์ธ์.
๋งค๊ฐ๋ณ์
SomeContext:createContext๋ก ์์ฑํ context์ ๋๋ค. context ์์ฒด๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ง ์์ผ๋ฉฐ, ์ปดํฌ๋ํธ์์ ์ ๊ณตํ๊ฑฐ๋ ์ฝ์ ์ ์๋ ์ ๋ณด์ ์ข ๋ฅ๋ฅผ ๋ํ๋ ๋๋ค.
๋ฐํ๊ฐ
useContext ๋ ํธ์ถํ๋ ์ปดํฌ๋ํธ์ ๋ํ context ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด ๊ฐ์ ํธ๋ฆฌ์์ ํธ์ถํ๋ ์ปดํฌ๋ํธ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด SomeContext.Provider ์ ์ ๋ฌ๋ value๋ก ๊ฒฐ์ ๋ฉ๋๋ค. provider๊ฐ ์์ผ๋ฉด ๋ฐํ๋ ๊ฐ์ ํด๋น ์ปจํ
์คํธ์ ๋ํด createContext ์ ์ ๋ฌํ defaultValue ๊ฐ ๋ฉ๋๋ค. ๋ฐํ๋ ๊ฐ์ ํญ์ ์ต์ ์ํ์
๋๋ค. ์ปจํ
์คํธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด React๋ ์๋์ผ๋ก ํด๋น context ๋ฅผ ์ฝ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํฉ๋๋ค.
์ฃผ์ ์ฌํญ
- ์ปดํฌ๋ํธ ๋ด์
useContext()ํธ์ถ์ ๋์ผํ ์ปดํฌ๋ํธ์์ ๋ฐํ๋ provider์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค. ํด๋นํ๋<Context.Provider>๋useContext()ํธ์ถ์ ํ๋ ์ปดํฌ๋ํธ ์์ ๋ฐฐ์น๋์ด์ผ ํฉ๋๋ค. - React๋ ๋ค๋ฅธ
value์ ๋ฐ๋ provider๋ก๋ถํฐ ์์ํด์ ํน์ context๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์์๋ค์ ์๋์ผ๋ก ๋ฆฌ๋ ๋๋งํฉ๋๋ค. ์ด์ ๊ฐ๊ณผ ๋ค์ ๊ฐ์Object.is๋น๊ต๋ฅผ ํตํด ๋น๊ต๋ฉ๋๋ค.memo๋ก ๋ฆฌ๋ ๋๋ง์ ๊ฑด๋๋ฐ์ด๋ ์์๋ค์ด ์๋ก์ด context ๊ฐ์ ๋ฐ๋ ๊ฒ์ ๋ง์ง๋ ๋ชปํฉ๋๋ค. - ๋น๋ ์์คํ
์ด ๊ฒฐ๊ณผ๋ฌผ์ ์ค๋ณต ๋ชจ๋์ ์์ฑํ๋ ๊ฒฝ์ฐ(์ฌ๋ณผ๋ฆญ ๋งํฌ์์ ๋ฐ์ํ ์ ์์) context๊ฐ ์์๋ ์ ์์ต๋๋ค. context๋ฅผ ํตํด ๋ฌด์ธ๊ฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์
===๋น๊ต์ ์ํด ๊ฒฐ์ ๋๋ ๊ฒ์ฒ๋ผ ์ปจํ ์คํธ๋ฅผ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉํ๋SomeContext์ context๋ฅผ ์ฝ๋ ๋ฐ ์ฌ์ฉํ๋SomeContext๊ฐ ์ ํํ๊ฒ ๋์ผํ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ์๋ง ์๋ํฉ๋๋ค.
์ฌ์ฉ๋ฒ
ํธ๋ฆฌ์ ๊น์ ๊ณณ์ ๋ฐ์ดํฐ ์ ๋ฌํ๊ธฐ
์ปดํฌ๋ํธ์ ์ต์์ ์์ค์์ useContext๋ฅผ ํธ์ถํ์ฌ context๋ฅผ ์ฝ๊ณ ๊ตฌ๋
ํฉ๋๋ค.
import { useContext } from 'react';
function Button() {
const theme = useContext(ThemeContext);
// ...useContext๋ ์ ๋ฌํ context ์ ๋ํ context value ๋ฅผ ๋ฐํํฉ๋๋ค. context ๊ฐ์ ๊ฒฐ์ ํ๊ธฐ ์ํด React๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๊ฒ์ํ๊ณ ํน์ context์ ๋ํด ์์์์ ๊ฐ์ฅ ๊ฐ๊น์ด context provider๋ฅผ ์ฐพ์ต๋๋ค.
context๋ฅผ Button์ ์ ๋ฌํ๋ ค๋ฉด ํด๋น ๋ฒํผ ๋๋ ์์ ์ปดํฌ๋ํธ ์ค ํ๋๋ฅผ ํด๋น context provider๋ก ๊ฐ์๋๋ค:
function MyPage() {
return (
<ThemeContext.Provider value="dark">
<Form />
</ThemeContext.Provider>
);
}
function Form() {
// ... ๋ด๋ถ์์ ๋ฒํผ์ ๋ ๋๋งํฉ๋๋ค. ...
}provider์ Button์ฌ์ด์ ์ผ๋ง๋ ๋ง์ ์ปดํฌ๋ํธ ๋ ์ด์ด๊ฐ ์๋์ง๋ ์ค์ํ์ง ์์ต๋๋ค. Form ๋ด๋ถ์ Button ์ด ์ด๋์์๋ useContext(ThemeContext)๋ฅผ ํธ์ถํ๋ฉด,"dark"๋ฅผ ๊ฐ์ผ๋ก ๋ฐ์ต๋๋ค.
import { createContext, useContext } from 'react'; const ThemeContext = createContext(null); export default function MyApp() { return ( <ThemeContext.Provider value="dark"> <Form /> </ThemeContext.Provider> ) } function Form() { return ( <Panel title="Welcome"> <Button>Sign up</Button> <Button>Log in</Button> </Panel> ); } function Panel({ title, children }) { const theme = useContext(ThemeContext); const className = 'panel-' + theme; return ( <section className={className}> <h1>{title}</h1> {children} </section> ) } function Button({ children }) { const theme = useContext(ThemeContext); const className = 'button-' + theme; return ( <button className={className}> {children} </button> ); }
Context๋ฅผ ํตํด ์ ๋ฌ๋ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธํ๊ธฐ
๊ฐ๋์ context๊ฐ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. context๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ค๋ฉด state์ ๊ฒฐํฉํ์ญ์์ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ state๋ณ์๋ฅผ ์ ์ธํ๊ณ ํ์ฌ state๋ฅผcontext value๋ก provider์ ์ ๋ฌํฉ๋๋ค.
function MyPage() {
const [theme, setTheme] = useState('dark');
return (
<ThemeContext.Provider value={theme}>
<Form />
<Button onClick={() => {
setTheme('light');
}}>
Switch to light theme
</Button>
</ThemeContext.Provider>
);
}์ด์ provider ๋ด๋ถ์ ๋ชจ๋ Button์ ํ์ฌ theme ๊ฐ์ ๋ฐ๊ฒ ๋ฉ๋๋ค. provider์๊ฒ ์ ๋ฌ๋ theme๊ฐ์ ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด setTheme์ ํธ์ถํ๋ฉด, ๋ชจ๋ Button ์ปดํฌ๋ํธ๊ฐ ์๋ก์ด 'light' ๊ฐ์ผ๋ก ๋ฆฌ๋ ๋๋ง ๋ฉ๋๋ค.
์์ 1 of 5: Context๋ฅผ ํตํด ๊ฐ ์
๋ฐ์ดํธ
์ด ์์์์ MyApp ์ปดํฌ๋ํธ๋ state ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ด state ๋ณ์๋ ThemeContext provider ๋ก ์ ๋ฌ๋ฉ๋๋ค. โDark modeโ ์ฒดํฌ๋ฐ์ค๋ฅผ ์ฒดํฌํ๋ฉด state๊ฐ ์
๋ฐ์ดํธ ๋ฉ๋๋ค. ์ ๊ณต๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ํด๋น context๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ฉ๋๋ค.
import { createContext, useContext, useState } from 'react'; const ThemeContext = createContext(null); export default function MyApp() { const [theme, setTheme] = useState('light'); return ( <ThemeContext.Provider value={theme}> <Form /> <label> <input type="checkbox" checked={theme === 'dark'} onChange={(e) => { setTheme(e.target.checked ? 'dark' : 'light') }} /> Use dark mode </label> </ThemeContext.Provider> ) } function Form({ children }) { return ( <Panel title="Welcome"> <Button>Sign up</Button> <Button>Log in</Button> </Panel> ); } function Panel({ title, children }) { const theme = useContext(ThemeContext); const className = 'panel-' + theme; return ( <section className={className}> <h1>{title}</h1> {children} </section> ) } function Button({ children }) { const theme = useContext(ThemeContext); const className = 'button-' + theme; return ( <button className={className}> {children} </button> ); }
value="dark"๋ "dark" ๋ฌธ์์ด์ ์ ๋ฌํ์ง๋ง, value={theme}๋ JSX ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ JavaScript theme ๋ณ์ ๊ฐ์ ์ ๋ฌํฉ๋๋ค. ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ด์ด ์๋ context ๊ฐ๋ ์ ๋ฌํ ์ ์์ต๋๋ค.
fallback ๊ธฐ๋ณธ๊ฐ ์ง์
React๊ฐ ๋ถ๋ชจ ํธ๋ฆฌ์์ ํน์ context providers๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ, useContext()๊ฐ ๋ฐํํ๋ context ๊ฐ์ ํด๋น context๋ฅผ ์์ฑํ ๋์ง์ ํ ๊ธฐ๋ณธ๊ฐ๊ณผ ๋์ผํฉ๋๋ค.
const ThemeContext = createContext(null);๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. context๋ฅผ ์ ๋ฐ์ดํธํ๋ ค๋ฉด ์์์ ์ค๋ช ํ ๋๋ก ์ํ์ ํจ๊ป ์ฌ์ฉํ์ธ์.
์๋ฅผ ๋ค์ด null ๋์ ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ ์๋ฏธ ์๋ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
const ThemeContext = createContext('light');์ด๋ ๊ฒ ํ๋ฉด ์ค์๋ก ํด๋น provider ์์ด ์ผ๋ถ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํด๋ ๊นจ์ง์ง ์์ต๋๋ค. ๋ํ ํ ์คํธ ํ๊ฒฝ์์ ๋ง์ provider๋ฅผ ์ค์ ํ์ง ์๊ณ ๋ ์ปดํฌ๋ํธ๊ฐ ํ ์คํธ ํ๊ฒฝ์์ ์ ์๋ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์๋ ์์ ์์ โToggle themeโ ๋ฒํผ์ ํ
๋ง context provider์ ์ธ๋ถ ์ ์๊ณ ๊ธฐ๋ณธ ์ปจํ
์คํธ ํ
๋ง ๊ฐ์ด 'light'์ด๊ธฐ ๋๋ฌธ์ ํญ์ ๋ฐ๊ฒ ํ์๋์ด ์์ต๋๋ค. ๊ธฐ๋ณธ ํ
๋ง๋ฅผ 'dark'๋ก ๋ณ๊ฒฝํด ๋ณด์ธ์.
import { createContext, useContext, useState } from 'react'; const ThemeContext = createContext('light'); export default function MyApp() { const [theme, setTheme] = useState('light'); return ( <> <ThemeContext.Provider value={theme}> <Form /> </ThemeContext.Provider> <Button onClick={() => { setTheme(theme === 'dark' ? 'light' : 'dark'); }}> Toggle theme </Button> </> ) } function Form({ children }) { return ( <Panel title="Welcome"> <Button>Sign up</Button> <Button>Log in</Button> </Panel> ); } function Panel({ title, children }) { const theme = useContext(ThemeContext); const className = 'panel-' + theme; return ( <section className={className}> <h1>{title}</h1> {children} </section> ) } function Button({ children, onClick }) { const theme = useContext(ThemeContext); const className = 'button-' + theme; return ( <button className={className} onClick={onClick}> {children} </button> ); }
ํธ๋ฆฌ์ ์ผ๋ถ context ์ค๋ฒ๋ผ์ด๋ ํ๊ธฐ
ํธ๋ฆฌ์ ์ผ๋ถ๋ถ์ ๋ค๋ฅธ ๊ฐ์ provider๋ก ๊ฐ์ธ์ ํด๋น ๋ถ๋ถ์ ๋ํ context๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ ์ ์์ต๋๋ค.
<ThemeContext.Provider value="dark">
...
<ThemeContext.Provider value="light">
<Footer />
</ThemeContext.Provider>
...
</ThemeContext.Provider>ํ์ํ ๋งํผ provider๋ฅผ ์ค์ฒฉํ๊ณ ์ค๋ฒ๋ผ์ด๋ ํ ์ ์์ต๋๋ค.
์์ 1 of 2: theme ์ค๋ฒ๋ผ์ด๋
์ฌ๊ธฐ์ Footer ๋ด๋ถ์ ๋ฒํผ์ ์ธ๋ถ์ ๋ฒํผ("dark")๊ณผ ๋ค๋ฅธ context ๊ฐ("light")์ ๋ฐ์ต๋๋ค.
import { createContext, useContext } from 'react'; const ThemeContext = createContext(null); export default function MyApp() { return ( <ThemeContext.Provider value="dark"> <Form /> </ThemeContext.Provider> ) } function Form() { return ( <Panel title="Welcome"> <Button>Sign up</Button> <Button>Log in</Button> <ThemeContext.Provider value="light"> <Footer /> </ThemeContext.Provider> </Panel> ); } function Footer() { return ( <footer> <Button>Settings</Button> </footer> ); } function Panel({ title, children }) { const theme = useContext(ThemeContext); const className = 'panel-' + theme; return ( <section className={className}> {title && <h1>{title}</h1>} {children} </section> ) } function Button({ children }) { const theme = useContext(ThemeContext); const className = 'button-' + theme; return ( <button className={className}> {children} </button> ); }
๊ฐ์ฒด์ ํจ์๋ฅผ ์ ๋ฌํ ๋ ๋ฆฌ๋ ๋๋ง ์ต์ ํํ๊ธฐ
context๋ฅผ ํตํด ๊ฐ์ฒด์ ํจ์๋ฅผ ํฌํจํ ๋ชจ๋ ๊ฐ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
function MyApp() {
const [currentUser, setCurrentUser] = useState(null);
function login(response) {
storeCredentials(response.credentials);
setCurrentUser(response.user);
}
return (
<AuthContext.Provider value={{ currentUser, login }}>
<Page />
</AuthContext.Provider>
);
}์ฌ๊ธฐ์ context value์ ๋ ๊ฐ์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ด๋ฉฐ, ๊ทธ ์ค ํ๋๋ ํจ์์
๋๋ค. MyApp์ด ๋ค์ ๋ ๋๋งํ ๋๋ง๋ค(์๋ฅผ ๋ค์ด ๊ฒฝ๋ก ์
๋ฐ์ดํธ ์) ๋ค๋ฅธ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋ ๊ฒ์ด๋ฏ๋ก React๋ useContext(AuthContext)๋ฅผ ํธ์ถํ๋ ํธ๋ฆฌ ๊น์ํ ๊ณณ์ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋งํด์ผ ํฉ๋๋ค.
์์ ์ฑ์์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ currentUser์ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด ๋ค์ ๋ ๋๋งํ ํ์๊ฐ ์์ต๋๋ค. React๊ฐ ์ด ์ฌ์ค์ ํ์ฉํ ์ ์๋๋ก login ํจ์๋ฅผ useCallback์ผ๋ก ๊ฐ์ธ๊ณ ๊ฐ์ฒด ์์ฑ์ useMemo๋ก ๊ฐ์ธ๋ฉด ๋ฉ๋๋ค. ์ด๊ฒ์ด ์ฑ๋ฅ ์ต์ ํ์
๋๋ค.
import { useCallback, useMemo } from 'react';
function MyApp() {
const [currentUser, setCurrentUser] = useState(null);
const login = useCallback((response) => {
storeCredentials(response.credentials);
setCurrentUser(response.user);
}, []);
const contextValue = useMemo(() => ({
currentUser,
login
}), [currentUser, login]);
return (
<AuthContext.Provider value={contextValue}>
<Page />
</AuthContext.Provider>
);
}์ด ๋ณ๊ฒฝ์ผ๋ก ์ธํด MyApp์ด ๋ค์ ๋ ๋๋งํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ currentUser๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ useContext(AuthContext)๋ฅผ ํธ์ถํ๋ ์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋งํ ํ์๊ฐ ์์ต๋๋ค.
useMemo ์ useCallback ์ ๋ํด ์์ธํ ์์๋ณด์ธ์.
๋ฌธ์ ํด๊ฒฐ
์ปดํฌ๋ํธ์ provider ๊ฐ์ด ๋ณด์ด์ง ์์ต๋๋ค.
์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
useContext()๋ฅผ ํธ์ถํ๋ ์ปดํฌ๋ํธ์ ๋์ผํ ์ปดํฌ๋ํธ(๋๋ ๊ทธ ์๋)์์<SomeContext.Provider>๋ฅผ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ.<SomeContext.Provider>๋ฅผuseContext()๋ฅผ ํธ์ถํ๋ ์ปดํฌ๋ํธ์ ์์ ๋ฐ๊นฅ์ผ๋ก ์ด๋ํ์ธ์.- ์ปดํฌ๋ํธ๋ฅผ
<SomeContext.Provider>๋ก ๊ฐ์ธ๋ ๊ฒ์ ์์๊ฑฐ๋ ์๊ฐํ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ํธ๋ฆฌ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ฐฐ์นํ์ ์ ์์ต๋๋ค. React ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ธต ๊ตฌ์กฐ๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ์ธ์. - ์ ๊ณตํ๋ ์ปดํฌ๋ํธ์์ ๋ณด๋
someContext์ ์ฝ๋ ์ปดํฌ๋ํธ์์ ๋ณด๋someContext๊ฐ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋๋ ๋น๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํ์ธํ๋ ค๋ฉดwindow.SomeContext1์window.SomeContext2์ ์ ์ญ์ ํ ๋นํ๊ณ ์ฝ์์์window.SomeContext1 === window.SomeContext2์ธ์ง ํ์ธํ๋ฉด ๋ฉ๋๋ค. ๋์ผํ์ง ์์ ๊ฒฝ์ฐ ๋น๋ ๋๊ตฌ ์์ค์์ ํด๋น ๋ฌธ์ ๋ฅผ ์์ ํ์ธ์.
๊ธฐ๋ณธ๊ฐ์ด ๋ค๋ฅธ๋ฐ๋ context๊ฐ undefined์ด ๋ฉ๋๋ค.
ํธ๋ฆฌ์ value๊ฐ ์๋ provider๊ฐ ์์ ์ ์์ต๋๋ค.
// ๐ฉ Doesn't work: no value prop
<ThemeContext.Provider>
<Button />
</ThemeContext.Provider>value๋ฅผ ์ง์ ํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆฐ ๊ฒฝ์ฐ, value={undefined}๋ฅผ ์ ๋ฌํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ค์๋ก ๋ค๋ฅธ prop์ ์ด๋ฆ์ ์ค์๋ก ์ฌ์ฉํ์ ์๋ ์์ต๋๋ค.
// ๐ฉ Doesn't work: prop should be called "value"
<ThemeContext.Provider theme={theme}>
<Button />
</ThemeContext.Provider>๋ ๊ฐ์ง ๊ฒฝ์ฐ ๋ชจ๋ ์ฝ์์ React์์ ๊ฒฝ๊ณ ๊ฐ ํ์๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ์์ ํ๋ ค๋ฉด prop value๋ฅผ ํธ์ถํ์ธ์.
// โ
Passing the value prop
<ThemeContext.Provider value={theme}>
<Button />
</ThemeContext.Provider>createContext(defaultValue) ํธ์ถ์ ๊ธฐ๋ณธ๊ฐ์ ์์ ์ผ์นํ๋ provider๊ฐ ์ ํ ์๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ๋๋ค๋ ์ ์ ์ ์ํ์ธ์. ๋ถ๋ชจ ํธ๋ฆฌ ์ด๋๊ฐ์ <SomeContext.Provider value={undefined}> ์ปดํฌ๋ํธ๊ฐ ์๋ ๊ฒฝ์ฐ, useContext(SomeContext)๋ฅผ ํธ์ถํ๋ ์ปดํฌ๋ํธ๋ undefined๋ฅผ context ๊ฐ์ผ๋ก ๋ฐ์ต๋๋ค.