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 ๊ฐ์ผ๋ก ๋ฐ์ต๋๋ค.