๋ฆฌ์กํธ์ ํด๋์คํ ์ปดํฌ๋ํธ์ ๋ํด ์์๋ณด์๋ค.
๊ทธ๋ฌ๋ฉด์ ์์ฐ์ค๋ Hook์ ๋ํด ์๊ฒ๋์๊ณ ,
React ์ฝ๋์ ๋๋ถ๋ถ์ Hook์ผ๋ก ์ด๋ค์ง ๊ฑธ ์๊ฒ๋์๋ค.
Hook์ด ๋ฌด์์ธ์ง, ์์ธํ๊ฒ ์์๋ณด์.
1. React Hook์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
- ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ํจ์ํ ์ปดํฌ๋ํธ์ ํด๋์คํ ์ปดํฌ๋ํธ๋ก ๋๋๋ค.
- ๋ฆฌ์กํธ ์ด๊ธฐ์๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ผ๋, ๊ฐ์ ์ํ๋ฅผ ๊ด๋ฆฌ(state) ํน์ ์๋ช ์ฃผ๊ธฐ(์ปดํฌ๋ํธ๊ฐ ์์ฑ๋๊ณ ์ฌ๋ผ์ง๋ ๊ณผ์ )๋ฅผ ์ฌ์ฉํด์ผํ ๋๋ง ํด๋์คํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ค.
- ํด๋์คํ ์ปดํฌ๋ํธ๋ ์ฝ๋์ ๊ตฌ์ฑ์ด ์ด๋ ต๊ณ ์ฌ์ฌ์ฉ์ฑ์ด ๋จ์ด์ง๋ค. ์ฝ๋ ์ต์ ํ๋ ์ด๋ ต๊ณ ์ต์ ๊ธฐ์ ์ฌ์ฉ๋ ํจ๊ณผ์ ์ด์ง ์๋ค.
- ๊ทธ๋์ ์ด๋ฐ ํด๋์คํ ์ปดํฌ๋ํธ์ ๋จ์ ์ ๋ณด์ํ๋ฉด์, ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋ฑ์ฅํ ๊ฒ์ด ๋ฐ๋ก React Hook(๋ฆฌ์กํธ ํ )์ด๋ค.
2. React Hook
- ๋ฆฌ์กํธ v16.8์ ์๋ก ๋์ ๋ ๊ธฐ๋ฅ์ผ๋ก ํจ์ํ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋ ๋ช๊ฐ์ง ๊ธฐ์ ๋ค์ ์ผ์ปซ๋๋ค.
- ๋ฆฌ์กํธ ํ ์ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ํด๋์คํ ์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค.
- ์ฃผ๋ก ๋ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด useEffect, useState ๋ฑ์ด ์๋ค.
3. ContextHook
- Context๋ ์ปดํฌ๋ํธ๊ฐ Props๋ฅผ ์ ๋ฌํ์ง ์๊ณ ๋ ๋ฉ๋ฆฌ ์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ณด๋ฅผ ๋ฐ์ ์ ์๊ฒ ํด์ค๋ค.
- useContext
a) useContext๋ ์ปดํฌ๋ํธ์์ Context๋ฅผ ์ฝ๊ณ ๊ตฌ๋ ํ ์ ์๋ React Hook์ด๋ค.
b) useContext๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ด๋์ง์ ๋ํ SomeContext(ThemeContext)๊ฐ ํ์ํ๋ค.
c) ์ด๋ ์ค์ํ ๊ฒ์ SomeContext(ThemeContext)๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ง ์๋ค. ์ปดํฌ๋ํธ์์ ์ ๊ณตํ๊ฑฐ๋ ์ฝ์ ์ ์๋ ์ ๋ณด์ ์ข ๋ฅ๋ฅผ ๋ํ๋ธ๋ค.
d) ํธ๋ฆฌ์์ ํธ์ถํ๋ ์ปดํฌ๋ํธ ์์์ ๊ฐ์ฅ ๊ฐ๊น์ด SomeContext(ThemeContext)์ ์ ๋ฌ๋ ๊ฐ์ผ๋ก ๊ฒฐ์ ๋๋ค. (๊ทธ๋ฌ๋๊น ๋ฌด์กฐ๊ฑด ์์ SomeContext๋ฅผ ์ ์ด๋ฌ์ผํ๋ค. ํ์์ ์ ์ผ๋ฉด ์๋๋ค.)
e) Context๊ฐ ๋ณ๊ฒฝ๋๋ฉด React๋ ์๋์ผ๋ก ํด๋น Context๋ฅผ ์ฝ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ๋ค.
import { createContext, useContext, useState } from 'react';
// 1.
// Context๋ฅผ ๋ง๋ค์ด์ค๋ค.
// ์ฌ๊ธด ํ
๋ง ์ปจํ
์คํธ๋ก ์ค์ ๋ ๊ฐ์ Provider ์ ๋ฌํ๋ค.
const ThemeContext = createContext(null);
export default function MyApp() {
// 2.
// ๊ธฐ๋ณธ๊ฐ์ ๋ฐ๊ฒ ์ค์ ๋์ด์๋ค. useState๋ก ๋ณ๊ฒฝ์ ๊ฐ์งํ์ฌ ๋ ๋๋งํ ๊ฒ์ด๋ค.
const [theme, setTheme] = useState('light');
return (
// 3.
// ์ฒดํฌ๋ฐ์ค๋ก ์ฌ์ฉ์๊ฐ ์ค์ ํ๊ณ ์ฒดํฌํ ์, ์ด๋ฒคํธ ๊ฐ์ฒด e๊ฐ ํ์ธํ๋ค.
// e.target์ผ๋ก ์ฌ์ฉ์๊ฐ dark๋ฅผ ์ฒดํฌํ๋์ง, light๋ฅผ ์ฒดํฌํ๋์ง ํ์ธํ๋ค.
// ์ฒดํฌ๋ฐ์ค์ ํ์๊ฐ ์๊ธฐ๋ฉด true -> dark, false -> light๊ฐ ๋๋ค.
<ThemeContext value={theme}>
<Form />
<label>
<input
type="checkbox"
checked={theme === 'dark'}
onChange={(e) => {
setTheme(e.target.checked ? 'dark' : 'light')
}}
/>
Use dark mode
</label>
</ThemeContext>
)
}
// Form์ ์์ ๋ณ๊ฒฝ์ด ์๋ค.
function Form({ children }) {
return (
<Panel title="Welcome">
<Button>Sign up</Button>
<Button>Log in</Button>
</Panel>
);
}
//
function Panel({ title, children }) {
// 4.
// ์์ ์ด๋ค ๋ ์ด์ด๊ฐ ์๋์ง ์ ๊ฒฝ์ฐ์ง ์๋๋ค.
// useContext๋ฅผ ์ฌ์ฉํ์ฌ ThemeContext์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋ค.
// provider๊ฐ ํ
๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๊ธฐ์ ๋ด์์ค๋ค.
const theme = useContext(ThemeContext);
// ์ฌ๊ธฐ์ className์ ์ ํด์ง๋ค. 'panel-dark' ์ด๋ฐ์์ผ๋ก
const className = 'panel-' + theme;
return (
// ์์์ด ๋ณ๊ฒฝ๋์ด ๋ฆฌํด๋๋ค.
<section className={className}>
<h1>{title}</h1>
// ์ด๋ฆฐ ํ๊ทธ, ๋ซํ ํ๊ทธ ์ฌ์ด์ ๋ฃ์ ๋ชจ๋ ๊ฑธ children์ด๋ผ๊ณ ํ๋ค.
{children}
</section>
)
}
function Button({ children }) {
const theme = useContext(ThemeContext);
const className = 'button-' + theme;
return (
<button className={className}>
{children}
</button>
);
}
Q. SomeContext๋ฅผ ๋น์ ๋ก ์ ์ด๋ณด์๋ฉด?
A. ์ฒ์์ ์์๊ฐ์ด ์ ๋ณด๋ฅผ ๋ด์์ ์ค๋ค๊ณ ์ดํดํ๋ค. ๊ทธ๋ฌ๋ ๋ฆฌ์กํธ ํ์ด์ง์ ๋ณด๋ฉด ์ ๋ณด๋ฅผ ๋ด์ง ์๋๋ค๊ณ ํ๋ค. ๊ทธ๋ฌ๋ฉด ํต๋ก๊ฐ์ ๊ฐ๋ ์ผ๋ก ์ดํดํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ํ ๋ง ์์์ด ๋ฐ๋๋ฉด ๋ฐ๋์๋ค๋ ๋ฐ๋ ์ ๋ณด๋ฅผ Provider๋ก ์ ๋ฌ๋ง ํ๋ ๋ฐฐ๊ด, ์ ๊น์ค ๊ฐ์ ์ญํ ์ธ ๋ฏ ํ๋ค.
๋ด์ฅ React Hook – React
The library for web and native user interfaces
ko.react.dev
useContext – React
The library for web and native user interfaces
ko.react.dev