๐ useContext๋ ๊ตฌ์ฑ ์์์ ์ปจํ ์คํธ๋ฅผ ์ฝ๊ณ ๊ตฌ๋ ํ ์ ์๊ฒ ํด์ฃผ๋ React Hook์ ๋๋ค .
์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก value๋ฅผ ์ ๋ฌํ ๋ props๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ฌ๋ ๋ถ๋ชจ โ ์์ โ ์์์ ์์
์ด๋ ๊ฒ ๋๋ฌด ๊น์ด์ง๊ฒ ๋๋ฉด prop drilling ํ์์ด ์ผ์ด๋๊ฒ ๋๋ค.
prop drilling์ ๋ฌธ์ ์
1. ๊น์ด๊ฐ ๋๋ฌด ๊น์ด์ง๋ฉด ์ด prop์ด ์ด๋ค ์ปดํฌ๋ํธ๋ก๋ถํฐ ์๋์ง ํ์
์ด ์ด๋ ต๋ค.
2. ์ด๋ค ์ปดํฌ๋ํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ถ์ ์ด ํ๋ค์ด์ง๋ ๋์ฒ๊ฐ ๋ฆ์ด์ง๋ค.
๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด ๋ฐ๋ก useContext() ์ด๋ค.
useContext hook์ ํตํด ์ฐ๋ฆฌ๋ ์ฝ๊ฒ ์ ์ญ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ๋์๋ค.
context API ํ์ ๊ฐ๋
createContext
ย : context ์์ฑ
Consumer
ย : context ๋ณํ ๊ฐ์ง
Provider
ย : context ์ ๋ฌ(to ํ์ ์ปดํฌ๋ํธ)
GrandFather โ Father โ Child
๋ก ๊ฐ์ ์ ๋ฌํ๋ ์์
// FamilyContext.js
import { createContext } from "react";
export const FamilyContext = createContext(null);
// GrandFatehr.jsx
import React from "react";
import Father from "./Father";
import { FamilyContext } from "../context/FamilyContext";
function GrandFather() {
const houseName = "ํ์จ๋ค ์ง";
const pocketMoney = 10000;
return (
<FamilyContext.Provider value={{ houseName, pocketMoney }}> // ๊ฐ์ฒด ํํ๋ก ์ ๋ฌ
<Father />
</FamilyContext.Provider>
);
}
export default GrandFather;
// Father.jsx
import React from "react";
import Child from "./Child";
function Father() { // props๋ฅผ ๋๊ฒจ ์ค ํ์๊ฐ ์๋ค.
return <Child />;
}
export default Father;
// Child.jsx
import React, { useContext } from "react";
import { FamilyContext } from "../context/FamilyContext";
function Child() {
const data = useContext(FamilyContext);
console.log(data); // ๊ฐ์ฒด๊ฐ ์ถ๋ ฅ๋๋ค.
return (
<div>
์ ํฌ ์ง ์ด๋ฆ์ {data.houseName} ์ด๊ณ , ์ ์ ์ฉ๋์ {data.pocketMoney}
์
๋๋ค.
</div>
);
}
export default Child;
useContext๋ฅผ ์ฌ์ฉํ ๋, Provider์์ ์ ๊ณตํ value๊ฐ ๋ฌ๋ผ์ง๋ค๋ฉด useContext๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ฏ๋ก value ๋ถ๋ถ์ ํญ์ ์ ๊ฒฝ์จ์ค์ผ ํ๋ค.
-> Memoization์ ํตํด ํด๊ฒฐ ๊ฐ๋ฅ or Redux