createContext
createContext
๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๊ฐ Context๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ์ฝ์ ์ ์์ต๋๋ค.
const SomeContext = createContext(defaultValue)
Reference
createContext(๊ธฐ๋ณธ๊ฐ)
์ปดํฌ๋ํธ ์ธ๋ถ์์ createContext
๋ฅผ ํธ์ถํ์ฌ ์ปจํ
์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
import { createContext } from 'react'; const ThemeContext = createContext('light');
์๋์์ ๋ ๋ง์ ์์๋ฅผ ํ์ธํ์ธ์.
๋งค๊ฐ๋ณ์
๊ธฐ๋ณธ๊ฐ
: ์ปดํฌ๋ํธ๊ฐ ์ปจํ ์คํธ๋ฅผ ์ฝ์ ๋ ์์์ ์ผ์นํ๋ ์ปจํ ์คํธ ์ ๊ณต์๊ฐ ์๋ ๊ฒฝ์ฐ ์ปจํ ์คํธ๊ฐ ๊ฐ์ ธ์ผ ํ ๊ฐ์ ๋๋ค. ์๋ฏธ ์๋ ๊ธฐ๋ณธ๊ฐ์ด ์์ผ๋ฉดnull
์ ์ง์ ํ์ธ์. ๊ธฐ๋ณธ๊ฐ์ โ์ตํ์ ์๋จโ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฐ์ ์ ์ ์ด๋ฉฐ ์๊ฐ์ด ์ง๋๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
๋ฐํ๊ฐ
createContext
returns a context object.
์ปจํ
์คํธ ๊ฐ์ฒด ์์ฒด๋ ์ด๋ ํ ์ ๋ณด๋ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ์ฝ๊ฑฐ๋ ์ ๊ณตํ๋ ์ด๋ค ์ปจํ
์คํธ๋ฅผ ๋ํ๋
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์์ ์ปดํฌ๋ํธ์์ ์ปจํ
์คํธ ๊ฐ์ ์ง์ ํ๊ธฐ ์ํด SomeContext.Provider
๋ฅผ ์ฌ์ฉํ๊ณ , ์๋ ์ปดํฌ๋ํธ์์ ์ฝ๊ธฐ ์ํด useContext(SomeContext)
๋ฅผ ํธ์ถํฉ๋๋ค. ์ปจํ
์คํธ ๊ฐ์ฒด์๋ ๋ช ๊ฐ์ง ์์ฑ์ด ์์ต๋๋ค.
SomeContext.Provider
๋ ์ปดํฌ๋ํธ์ ์ปจํ ์คํธ ๊ฐ์ ์ ๊ณตํ๊ฒ ํด์ค๋๋ค.SomeContext.Consumer
๋ ์ปจํ ์คํธ ๊ฐ์ ์ฝ๋ ๋์์ ์ด๋ฉฐ ๋๋ฌผ๊ฒ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
SomeContext.Provider
์ปดํฌ๋ํธ๋ฅผ ์ปจํ ์คํธ ์ ๊ณต์๋ก ๊ฐ์ธ์ ์ด ์ปจํ ์คํธ์ ๊ฐ์ ๋ชจ๋ ๋ด๋ถ ์ปดํฌ๋ํธ์ ์ง์ ํฉ๋๋ค.
function App() { const [theme, setTheme] = useState('light'); // ... return ( <ThemeContext.Provider value={theme}> <Page /> </ThemeContext.Provider> ); }
Props
value
: ์ด ์ ๊ณต์ ๋ด๋ถ์ ์ปจํ ์คํธ๋ฅผ ์ฝ๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ ค๋ ๊ฐ์ ๋๋ค. ์ปจํ ์คํธ ๊ฐ์ ์ด๋ ํ ์ ํ์ด๋ ๋ ์ ์์ต๋๋ค. ์ ๊ณต์ ๋ด๋ถ์์useContext(SomeContext)
๋ฅผ ํธ์ถํ๋ ์ปดํฌ๋ํธ๋ ๊ทธ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ํด๋น ์ปจํ ์คํธ ์ ๊ณต์์value
๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค.
SomeContext.Consumer
useContext
๊ฐ ์กด์ฌํ๊ธฐ ์ ์๋ ์ปจํ
์คํธ๋ฅผ ์ฝ๋ ๋ ์ค๋๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
function Button() { // ๐ก ์ด์ ๋ฐฉ์ (๊ถ์ฅํ์ง ์์) return ( <ThemeContext.Consumer> {theme => ( <button className={theme} /> )} </ThemeContext.Consumer> ); }
์ด ์ค๋๋ ๋ฐฉ๋ฒ์ ์ฌ์ ํ ์๋ํ์ง๋ง, ์๋ก ์์ฑ๋ ์ฝ๋๋ ๋์ useContext()
๋ก ์ปจํ
์คํธ๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค:
function Button() { // โ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ const theme = useContext(ThemeContext); return <button className={theme} />; }
Props
children
: ํจ์์ ๋๋ค. React๋useContext()
์ ๋์ผํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ฒฐ์ ๋ ํ์ฌ ์ปจํ ์คํธ ๊ฐ์ ์ ๋ฌํ์ฌ ํจ์๋ฅผ ํธ์ถํ๊ณ , ์ด ํจ์์์ ๋ฐํํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋๋งํฉ๋๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ปจํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด React๋ ์ด ํจ์๋ฅผ ๋ค์ ์คํํ๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ฌ์ฉ๋ฒ
์ปจํ ์คํธ ์์ฑ
์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ ๋ณด๋ฅผ ๊น๊ฒ ์ ๋ฌํ ์ ์์ต๋๋ค.
์ปดํฌ๋ํธ ์ธ๋ถ์์ 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๋ ์ปจํ
์คํธ๋ฅผ ์ฝ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํฉ๋๋ค.
์ปจํ ์คํธ ์ฝ๊ธฐ์ ์ ๊ณต์ ๋ํด ๋ ์์๋ณด๊ณ ์์๋ฅผ ํ์ธํ์ธ์.
ํ์ผ์์ ์ปจํ ์คํธ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ด๋ณด๋ด๊ธฐ
๋ค๋ฅธ ํ์ผ์ ์ปดํฌ๋ํธ๊ฐ ๋์ผํ ์ปจํ
์คํธ์ ์ก์ธ์คํด์ผ ํ ํ์๊ฐ ์ข
์ข
์์ต๋๋ค. ์ด๊ฒ์ด ๋ณ๋์ ํ์ผ์์ ์ปจํ
์คํธ๋ฅผ ์ ์ธํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ์ด์ ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ 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> ); }
์ด๊ฒ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ด๋ณด๋ด๊ธฐ์ ์ ์ฌํ๊ฒ ์๋ํฉ๋๋ค.
๋ฌธ์ ํด๊ฒฐ
I canโt find a way to change the context value
์ด๋ฐ ์ฝ๋๋ ๊ธฐ๋ณธ ์ปจํ ์คํธ ๊ฐ์ ์ง์ ํฉ๋๋ค.
const ThemeContext = createContext('light');
์ด ๊ฐ์ ์ ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. React๋ ์ผ์นํ๋ ์ ๊ณต์๊ฐ ์์ ์๋ ๊ฒฝ์ฐ ์ด ๊ฐ์ ๋์ฒด๋ก ์ฌ์ฉํฉ๋๋ค.
์๊ฐ์ด ์ง๋๋ฉด์ ์ปจํ ์คํธ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด, ์ํ๋ฅผ ์ถ๊ฐํ๊ณ ์ปดํฌ๋ํธ๋ฅผ ์ปจํ ์คํธ ์ ๊ณต์๋ก ๊ฐ์ธ์ธ์.