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๋Š” ์ผ์น˜ํ•˜๋Š” ์ œ๊ณต์ž๊ฐ€ ์œ„์— ์—†๋Š” ๊ฒฝ์šฐ ์ด ๊ฐ’์„ ๋Œ€์ฒด๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด, ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ปจํ…์ŠคํŠธ ์ œ๊ณต์ž๋กœ ๊ฐ์‹ธ์„ธ์š”.