์ฐธ๊ณ ์ฌ์ดํธ
• ๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์ - useContext
๐ useContext
useContext๋ ์ปดํฌ๋ํธ์ Context๋ฅผ ์ฝ๊ณ ๊ตฌ๋ ํ๊ฒ ํด์ฃผ๋ ๋ฆฌ์กํธ Hook์ด๋ค.
๋ฆฌ์กํธ์์ ๋ฐ์ดํฐ๊ฐ์ ํ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๊ธฐ ์ํด ์ปดํฌ๋ํธ ํธ์ถ ์, ๋ฐ์ดํฐ prop์ ๋ด๊ณ , ํด๋น props๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค.
useContext๋ ํด๋น ๊ณผ์ ์ ์๊ด์์ด useContext๋ก ๊ฐ์ผ ์ปดํฌ๋ํธ๋ค์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ ์ ์๋๋ก ๋์์ค๋ค.
๋น์ทํ ๊ธฐ๋ฅ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ recoil์ด ์๋ค.
๐ฆ Parameter
useContext ์ปจํ ์คํธ๋ฅผ ์ฝ๊ณ ๊ตฌ๋ ํ๋ ค๋ฉด ์ปดํฌ๋ํธ ์ต์์์์ ํธ์ถํด์ผํ๋ค.
const value = useContext(SomeContext);
• SomeContext: ํด๋น ์ปจํ ์คํธ๋ createContext๋ก ๋ง๋ค์ด์ง ๋ฐ์ดํฐ์ด๋ค.
์ปจํ ์คํธ ์์ฒด๋ ์ ๋ณด๋ฅผ ๋ณด์ ํ์ง ์์ผ๋ฉฐ ๊ตฌ์ฑ ์์์์ ์ ๊ณตํ๊ฑฐ๋ ์ฝ์ ์ ์๋ ์ ๋ณด์ ์ข ๋ฅ๋ง ๋ํ๋ธ๋ค.
๐ Return
useContext๋ ์ปดํฌ๋ํธ๊ฐ ํธ์ถํ ์ปจํ ์คํธ์ ๊ฐ์ ๋ฐํํ๋ค.
๊ฐ์ ํธ์ถํ ์ปดํฌ๋ํธ ์์ SomeContext.Provider์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฐ์ ์ ๋ฌํ๋ค.
๊ทธ๋ฌ๋ createContext๋ก ์์ฑํ ๊ฐ์ด ์๋ค๋ฉด defaultValue๋ฅผ ์ ๋ฌํ๋ค.
ํด๋น ๋ฐํ์ ํญ์ ์ ๋ฐ์ดํธ ๋๋ฉฐ, ๋ฆฌ์กํธ๋ ํด๋น ๊ฐ์ ์ฝ๊ณ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ-๋ฆฌ๋ ๋๋งํ๋ค.
โ ๏ธ ์ฃผ์์ฌํญ
• useContext() ์ปดํฌ๋ํธ์ ํธ์ถ์ ๋์ผํ ์ปดํฌ๋ํธ์์ ๋ฐํ๋ ์ปดํฌ๋ํธ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
์ฆ, A - B - C ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ๋, ๋ชจ๋ ์ปดํฌ๋ํธ์์ useContext๋ก ๊ฐ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, A์์ ์ ์ธํ์ฌ B,C์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ A ์ปดํฌ๋ํธ ์์์ Provider๋ก ๊ฐ์ธ์ A, B, C์์ ์ฌ์ฉํ๋๋กํ๋ค.
• ๋ฆฌ์กํธ๋ ๋ค๋ฅธ ๊ฐ์ ๋ฐ์์ ๋ ์ด์ ๊ฐ๊ณผ ๋ค์ ๊ฐ์ ๋น๊ตํ์ฌ ์๋์ผ๋ก ํ์ ์ปดํฌ๋ํธ๋ฅผ ๋ชจ๋ ๋ฆฌ-๋ ๋๋งํ๋ค.
memo๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ-๋ ๋๋ง์ ๊ฑด๋๋ฐ์ด๋ ํ์ ํญ๋ชฉ์ด ์๋ก์ด ์ปจํ ์คํธ ๊ฐ์ ๋ฐ๋ ๊ฒ์ ๋ง์ ์ ์๋ค.
• ๋น๋ ์์คํ ์ด ์ถ๋ ฅ์ ์ค๋ณต ๋ชจ๋์ ์์ฑํ๋ ๊ฒฝ์ฐ(์ฌ๋งํฌ์์ ๋ฐ์ํ ์ ์์), ์ปจํ ์คํธ๊ฐ ์ค๋จ๋ ์ ์๋ค.
์ปจํ ์คํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ SomeContext๋ฅผ ์ ๊ณตํ๋๋ฐ ์ฌ์ฉํ๋ ๊ฒ๊ณผ SomeContext๋ฅผ ์ฝ๋๋ฐ ์ฌ์ฉํ๋ ๊ฒ์ด ๋์ผํ ์ค๋ธ์ ํธ์ธ ๊ฒฝ์ฐ์๋ง ์๋ํ๋ค.
โ๏ธ ์ฌ์ฉ
Theme๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ๊ฐ๋จํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด๋ณด์.
Provider๋ฅผ ์์ฑํ์ฌ ๊ฐ์ ์ ๊ณตํ ์ปดํฌ๋ํธ๋ฅผ ์์ทํ๋ค.
๐ ThemeProvider
import { createContext, useState } from "react";
const defaultValue = "Value is not exist";
// ๊ฐ์ด ์์ ๋์ ๋ํ๋ผ ๋ด์ฉ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ (์๋ต ๊ฐ๋ฅ)
// 1. Context๋ฅผ ์์ฑ
export const ThemeContext = createContext(defaultValue);
// 2. Provider ์ปดํฌ๋ํธ์์ ๊ณต์ ํ ๊ฐ์ ์ ์ธ
export function ThemeProvider({ children }) {
const [isDark, setIsDark] = useState(false);
return (
// 3. createContext์ Provider๋ฅผ ํตํด ๊ฐ ์ ๋ฌ ํ,
// ํ์ ์ปดํฌ๋ํธ๋ค์ ์ฌ์ด์ {children}์ผ๋ก ์ฝ์
<ThemeContext.Provider value={{ isDark, setIsDark }}>
{children}
</ThemeContext.Provider>
);
}
๐ App.tsx
import { ThemeProvider } from "./ThemeProvider";
import { ThemeToggle } from "./ThemeToggle";
function App() {
return (
<>
<ThemeProvider>
<ThemeToggle />
</ThemeProvider>
</>
);
}
export default App;
์์ฑํ Provider ์ปดํฌ๋ํธ ํธ์ถ ํ, ํ์ ์ปดํฌ๋ํธ ์ฝ์ .
๐ ThemeToggle.tsx
import { useContext } from "react";
import { ThemeContext } from "./ThemeProvider";
export function ThemeToggle() {
const { isDark, setIsDark } = useContext(ThemeContext);
const handleChangeTheme = () => {
setIsDark(!isDark);
};
return (
<div>
<button
onClick={handleChangeTheme}
style={{
backgroundColor: isDark ? "black" : "white",
color: isDark ? "white" : "black",
}}
>
{isDark ? "๋ผ์ดํธ" : "๋คํฌ"}
</button>
</div>
);
}
ํด๋น ๊ธ์๋ ํด๋น ๋ชจ๋๋ก ๋ณ๊ฒฝํ๋ค๋ ์๋ฏธ๋ก ๋คํฌ์ผ๋ ๋ผ์ดํธ / ๋ผ์ดํธ์ผ ๋ ๋คํฌ๊ฐ ํ์๋๋ ๊ฒ์ผ๋ก ์์ฑํจ.
'Framework > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React / Next.js] Atomic ๋์์ธ ํจํด์ ๋ํด ์์๋ณด์. (4) | 2024.09.21 |
---|---|
[ React ] Custom Hook์ผ๋ก ๋ก์ง์ ์ฌ์ฌ์ฉํด๋ณด์. (0) | 2024.04.15 |
[ React ] useCallback์ ๋ํด ์์๋ณด์. (0) | 2024.04.05 |
[ React ] useMemo์ ๋ํด ์์๋ณด์. (0) | 2024.04.04 |
[ React ] useRef์ ๋ํด ์์๋ณด์. (0) | 2024.04.04 |