ํน์ ํ ๊ฐ์ ๋ชจ๋ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด๋๊ณ , ์ด๋์๋ ํน์ ํ ๊ฐ์ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ Hook
๋ฆฌ์กํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์์๋ถํฐ ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํด์ฃผ๋ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ์๋ค. ๋ง์ฝ ์ด๋ค ํ๋ก์ ํธ์์ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐ์ดํฐ(user, theme, language ๋ฑ)์ด ์๋ค๊ณ ํ์. ๊ทธ๋ผ, ์ต์์ App ์ปดํฌ๋ํธ์์๋ถํฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ ์๋ ํ์ ์ปดํฌ๋ํธ๊น์ง ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์ณ๊ฐ๋ฉฐ ์ ์กํด์ค์ผ ํ ๊ฒ์ด๋ค. ๐คฌ ํด๋น ๋ฐ์ดํฐ๊ฐ ํ์์๋ ์ปดํฌ๋ํธ์๊ฒ๋ ์ ํด์ค์ผํ๋ฏ๋ก ์ฝ๋๋ ๋ณต์กํด์ง๋ฟ๋๋ฌ, ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋ฉด ๋ชจ๋ ์ปดํฌ๋ํธ์์ ์ผ์ผํ ์์ ํด์ค์ผ ํ๋ค.ใ
ใ
(props drilling)
useContext๋ฅผ ์ฌ์ฉํ๋ฉด ์๊น์ฒ๋ผ ์ผ์ผํ props ๋ฅผ ๊ฑฐ์น์ง ์์๋ App ์ปดํฌ๋ํธ๊ฐ "์ด ๋ฐ์ดํฐ ํ์ํ ์ฌ๋~?" ํ๋ฉด ํด๋น ๋ฐ์ดํฐ๊ฐ ํ์ํ ์ปดํฌ๋ํธ์๊ฒ๋ง ๋ฐ๋ก ์ ๋ฌํด์ค ์ ์๋ค.
App.jsx
function App() {
const [isDark, setIsDark] = useState(false)
return <Page isDark={isDark} setIsDark={setIsDark} />
}
Page.jsx
import React from 'react'
function Page({ isDark, setIsDark }) {
return (
<div>
<Header isDark={isDark} />
<Content isDark={isDark} />
<Footer isDark={isDark} setIsDark={setIsDark} />
</div>
)
}
// ์ด ์๋๋ Page ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ค
function Header({ isDark }) {
return (
<header style={{ background: isDark ? 'black' : 'lightgray', color: isDark ? 'white' : 'black' }}>
<h1>ํ๊ธธ๋๋ ์๋
ํ์ธ์</h1>
</header>
)
}
function Content({ isDark }) {
return (
<div style={{ background: isDark ? 'black' : 'white', color: isDark ? 'white' : 'black' }}>
<p style={{}}>์ข์ ํ๋ฃจ ๋์ธ์</p>
</div>
)
}
function Footer({ isDark, setIsDark }) {
const toggleTheme = () => {
setIsDark(!isDark)
}
return (
<div>
<button onClick={toggleTheme}>๋คํฌ๋ชจ๋/๋ผ์ดํธ๋ชจ๋</button>{' '}
</div>
)
}
export default Page
์ฌ๊ธฐ์ Page๋ isDark, setIsDark๋ฅผ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋๋ค. ๊ทธ์ ํ์ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌ๋ง ํด์ค๋ฟ. ์ง๊ธ์ ์ค๊ฐ ์ญํ ์ ํ๋ ์ปดํฌ๋ํธ๊ฐ Page ํ๋๋ฟ์ด์ง๋ง ํ๋ก์ ํธ ๋จ์๊ฐ ์ปค์ง๋ฉด, ์ด๋ฐ ์ปดํฌ๋ํธ๊ฐ ๋ช ์ญ๊ฐ ๋ ์๋ ์์ ๊ฒ์ด๋ค. ๐ซ ์ด์ ๋ถํฐ useContext๋ฅผ ์ฌ์ฉํด ์ข ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์กํด๋ณด์!
context ์์ฑ
ThemeContext.js
import { createContext } from 'react'
export const ThemeContext = createContext(null)
์์ฑํ context.Provider๋ฅผ ํตํด์ ํน์ ํ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ฃผ๋ฉด, value ๋ถ๋ถ์ ๋ช
์ํ ๊ฐ์ ํ์ ์ปดํฌ๋ํธ์์ ํญ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
App.jsx
import { ThemeContext } from './components/context/ThemeContext'
import Page from './components/Hooks/Page'
function App() {
const [isDark, setIsDark] = useState(false)
return (
<ThemeContext.Provider value={{ isDark, setIsDark }}>
<Page />
</ThemeContext.Provider>
)
}
Page.jsx
import React, { useContext } from 'react'
import { ThemeContext } from '../context/ThemeContext'
function Page() {
return (
<div>
<Header />
<Content />
<Footer />
</div>
)
}
//ํ์ ์ปดํฌ๋ํธ์์๋ ์์ ๋ง๋ค์ด๋์ context๋ฅผ ๋ถ๋ฌ์จ ํ์
//useContext๋ฅผ ์จ์ฃผ๋ฉด Provider์ value ๋ถ๋ถ์ ํตํด์ ๋๊ฒจ์ค ๊ทธ ๊ฐ์ ๋ฐ๋ก ๋ฐ์์ฌ ์ ์๋ค
function Header() {
const { isDark } = useContext(ThemeContext)
return (
<header style={{ background: isDark ? 'black' : 'lightgray', color: isDark ? 'white' : 'black' }}>
<h1>ํ๊ธธ๋๋ ์๋
ํ์ธ์</h1>
</header>
)
}
function Content() {
const { isDark } = useContext(ThemeContext)
return (
<div style={{ background: isDark ? 'black' : 'white', color: isDark ? 'white' : 'black' }}>
<p style={{}}>์ข์ ํ๋ฃจ ๋์ธ์</p>
</div>
)
}
function Footer() {
const { isDark, setIsDark } = useContext(ThemeContext)
const toggleTheme = () => {
setIsDark(!isDark)
}
return (
<div>
<button onClick={toggleTheme}>๋คํฌ๋ชจ๋/๋ผ์ดํธ๋ชจ๋</button>{' '}
</div>
)
}
export default Page
Page ์ปดํฌ๋ํธ ์์ฒด๋ ๋ ์ด์ isDark,setIsDark์ ๊ด์ฌํ์ง ์์๋ ๋๋ค. ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ค๋ง useContext,ThemeContext๋ฅผ importํด์ค๋ฉด ๋๋ค.
์ด๋ ๊ฒ ๋ณด๋ฉด, useState๊ฐ ์๋ useContext๋ง ์ฌ์ฉํ๋ฉด ๋์ง ์๋? ์๊ฐํ ์๋ ์๋ค. ํ์ง๋ง, useContext๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ค์์ง ์ ์๋ค๋ ๋จ์ ์ด ์๋ค. ๋ฆฌ์กํธ ๊ณต์๋ฌธ์์์๋ ๋จ์ง prop drilling ํผํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฑฐ๋ผ๋ฉด, component composition ์ ๊ถ์ฅํ๋ค.
๊ฒฐ๋ก : ์ ๋ง๋ก ์ ์ฒด ์ปดํฌ๋ํธ์์ ๊ณต์ ๋์ด์ผ ํ๋ ๊ฐ์ด ์์ ๋ ์ฌ์ฉํ๋ฉด ๋๊ณ , ๊ฐ ์ปดํฌ๋ํธ๋ณ๋ก ๊ด๋ฆฌํ๋ ๊ฐ์ด๋ผ๋ฉด useState๋ฅผ ์ฐ๋ ๊ฒ์ด ์ ์ ํ๋ค.
์ค๋ ์๊ฒ ๋ ์ :
useContext๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ ์ฒด ์ปดํฌ๋ํธ์์ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๋ค๋ ๊ฑธ ์๊ฒ ๋์๋ค.
์ค๋ ๋ฐฐ์ด ๊ฒ ์ค ๋ ์๊ณ ์ถ๊ฑฐ๋ ๊ถ๊ธํ ์ :
๊ทผ๋ฐ redux ์ฌ์ฉํ๋ฉด ๋ ์์ํ ๊ฒ ๊ฐ๋ค...? ์ค๋ ๊ณต๋ถํ๊ณ redux TIL ๋ ์ ์ด์ผ์ง. ์ด์ธ์๋ component composition ์ ๋ํด ๋ ์๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
๋ฆฌ์กํธ ๊ณต์๋ฌธ์
์ค๋์ ์๊ฐ:
๋ณด๋์ฐฌ ํ๋ฃจ์๋ค.