[TIL] useContext

ํ˜ฑยท2023๋…„ 11์›” 8์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
26/85
post-thumbnail

useContext ๋ž€?

๐Ÿ‘‰ useContext๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝ๊ณ  ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” React Hook์ž…๋‹ˆ๋‹ค .

์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ value๋ฅผ ์ „๋‹ฌํ•  ๋•Œ props๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ€๋ชจ โ†’ ์ž์‹ โ†’ ์ž์‹์˜ ์ž์‹ ์ด๋ ‡๊ฒŒ ๋„ˆ๋ฌด ๊นŠ์–ด์ง€๊ฒŒ ๋˜๋ฉด prop drilling ํ˜„์ƒ์ด ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

prop drilling์˜ ๋ฌธ์ œ์ 
1. ๊นŠ์ด๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์–ด์ง€๋ฉด ์ด prop์ด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์™”๋Š”์ง€ ํŒŒ์•…์ด ์–ด๋ ต๋‹ค.
2. ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ถ”์ ์ด ํž˜๋“ค์–ด์ง€๋‹ˆ ๋Œ€์ฒ˜๊ฐ€ ๋Šฆ์–ด์ง„๋‹ค.

๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ useContext() ์ด๋‹ค.
useContext hook์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ์‰ฝ๊ฒŒ ์ „์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

context API ํ•„์ˆ˜ ๊ฐœ๋…

  • createContextย : context ์ƒ์„ฑ

  • Consumerย : context ๋ณ€ํ™” ๊ฐ์ง€

  • Providerย : context ์ „๋‹ฌ(to ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ)


useContext() ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

GrandFather โ†’ Father โ†’ Child ๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ์˜ˆ์‹œ

1. context > FamilyContext.js ์ƒ์„ฑ

// FamilyContext.js
import { createContext } from "react";

export const FamilyContext = createContext(null);

2. GrandFather.jsx ์ˆ˜์ •

// 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;

3. Father.jsx ์ˆ˜์ • (props๋ฅผ ์ œ๊ฑฐ!)

// Father.jsx
import React from "react";
import Child from "./Child";

function Father() { // props๋ฅผ ๋„˜๊ฒจ ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  return <Child />;
}

export default Father;

4. Child.jsx ์ˆ˜์ •

// 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

profile
๋Š๋ฆฌ๋”๋ผ๋„ ์กฐ๊ธˆ์”ฉ, ๊พธ์ค€ํžˆ

0๊ฐœ์˜ ๋Œ“๊ธ€