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๋ ์ผ์นํ๋ ์ ๊ณต์๊ฐ ์์ ์๋ ๊ฒฝ์ฐ ์ด ๊ฐ์ ๋์ฒด๋ก ์ฌ์ฉํฉ๋๋ค.
์๊ฐ์ด ์ง๋๋ฉด์ ์ปจํ ์คํธ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด, ์ํ๋ฅผ ์ถ๊ฐํ๊ณ ์ปดํฌ๋ํธ๋ฅผ ์ปจํ ์คํธ ์ ๊ณต์๋ก ๊ฐ์ธ์ธ์.