
prop drilling์ ๋ํญ๋ง ๐
useContexthook ์ ํตํด ์ ์ญ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ๋์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
=> ํ์ง๋ง ๋ฌด์กฐ๊ฑด ์ ์ญ ์ํ๋ผ๊ณ ํ ์ ์๋ค. Proivder์์ ์ด๋ค ๊ฐ์ ์ฃผ์ ํ๋๋์ ๋ฐ๋ผ ๋ถ๋ถ ์ ์ญ์ด ๋ ์ ์๋ค.
createContext : context๋ฅผ ์์ฑ
useContext : context๋ฅผ ๊ตฌ๋
ํ๊ณ ํด๋น context์ ํ์ฌ ๊ฐ์ ์ฝ์
Provider : context๋ฅผ ํ์ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌ

App.jsx
export๊ฐ ๋งค์ฐ ์ค์ํ๋ค
import "./App.css";
import GrandFather from "./components/GrandFather";
function App() {
return <GrandFather />;
}
export default App;
GrandFather.jsx
import React from "react";
import Father from "./Father";
function GrandFather() {
const houseName = "์คํ๊ฒํฐ ํ์ฐ์ค";
const pocketMoney = 10000;
return <Father houseName={houseName} pocketMoney={pocketMoney} />;
}
export default GrandFather;
Father.jsx
import React from "react";
import Child from "./Child";
function Father({ houseName, pocketMoney }) {
return <Child houseName={houseName} pocketMoney={pocketMoney} />;
}
export default Father;
Child.jsx
import React from "react";
function Child({ houseName, pocketMoney }) {
const stressedWord = {
color: "red",
fontWeight: "900",
};
return (
<div>
๋๋ ์ด ์ง์์ ๋ง๋ด์์.
<br />
ํ ์๋ฒ์ง๊ฐ ์ฐ๋ฆฌ ์ง ์ด๋ฆ์ <span style={stressedWord}>{houseName}</span>
๋ผ๊ณ ํ์
จ์ด์.
<br />
์ฉ๋์ <span style={stressedWord}>{pocketMoney}</span>์ ๋ฐ์ ์
์ฃผ์
จ์ต๋๋ค. ์์ฆ ๋ฌผ๊ฐ๋ฅผ ์ ๋ชจ๋ฅด์๋๋ฏํด์.
</div>
);
}
export default Child;
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
GrandFather ์ปดํฌ๋ํธ๋ Child ์ปดํฌ๋ํธ์๊ฒ houseName๊ณผ pocketMoney๋ฅผ ์ ๋ฌํด์ฃผ๊ธฐ ์ํด Father์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์น ์ ๋ฐ์ ์์๋ค. ๊ณ ์ ๋ง์ ์ฃผ๋ฉด์...
์๋ฌดํผ ๋นํจ์จ์ ์ด๋ค. ์ค๊ฐ ์ ๋ฌ์ฑ
์ด ๋ ๋ง์์ง๋ฉด ๊ท์ฐฎ์์ง ๊ฒ ๊ฐ๋ค.
์ด๋ด ๋ useContext๋ฅผ ์จ์ค๋ค.

context > FamilyContext.js ์์ฑ
import { createContext } from "react";
// ์ฌ๊ธฐ์ null์ ์ด๊ธฐ๊ฐ!
export const FamilyContext = createContext(null);
GrandFather.jsx ์์
import React from "react";
import Father from "./Father";
import { FamilyContext } from "../context/FamilyContext"; // 1. import
function GrandFather() {
const houseName = "์คํ๊ฒํฐ ํ์ฐ์ค";
const pocketMoney = 10000;
return (
<FamilyContext.Provider value={{ houseName, pocketMoney }}> // 2. ํ๋ก๋ฐ์ด๋ ์ด์ฉ๊ณ
<Father />
</FamilyContext.Provider>
);
}
export default GrandFather;
Father.jsx ์์ (props ์ซ์๋ด๊ธฐ)
import React from "react";
import Child from "./Child";
function Father() {
return <Child />;
}
export default Father;
Child.jsx ์์
import React, { useContext } from "react";
import { FamilyContext } from "../context/FamilyContext"; // 1. import
function Child({ houseName, pocketMoney }) {
const stressedWord = {
color: "red",
fontWeight: "900",
};
const data = useContext(FamilyContext); // 2. useContext ์ ์ธ
console.log("data", data);
return (
<div>
๋๋ ์ด ์ง์์ ๋ง๋ด์์.
<br />
ํ ์๋ฒ์ง๊ฐ ์ฐ๋ฆฌ ์ง ์ด๋ฆ์{" "}
<span style={stressedWord}>{data.houseName}</span> // 3. useContext ์ฌ์ฉ
๋ผ๊ณ ํ์
จ์ด์.
<br />
์ฉ๋์ <span style={stressedWord}>{data.pocketMoney}</span>์ ๋ฐ์ ์
์ฃผ์
จ์ต๋๋ค. ์์ฆ ๋ฌผ๊ฐ๋ฅผ ์ ๋ชจ๋ฅด์๋๋ฏํด์.
</div>
);
}
export default Child;

๐ซ ๋
re-renderingissue๋ฅผ ์ฃผ์
useContext๋ฅผ ์ฌ์ฉํ ๋, Provider์์ ์ ๊ณตํ value๊ฐ ๋ฌ๋ผ์ง๋ค๋ฉด useContext๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋๋๋ง ๋๋ค.
๐ฅ ๋ฐ๋ผ์ value ๋ถ๋ถ์ ํญ์ ์ ๊ฒฝ์จ์ค์ผํ๋ค.