240818 React useContext

์‹ ํ•œ๋ณ„ยท2024๋…„ 8์›” 17์ผ

๐Ÿ’ช ๋งค์ผ ๊ธฐ๋ก

๋ชฉ๋ก ๋ณด๊ธฐ
57/97
post-thumbnail

01. useContext

(1) useContext์˜ ํ•„์š”์„ฑ

prop drilling์˜ ๋Œ€ํ•ญ๋งˆ ๐Ÿ˜Ž
useContext hook ์„ ํ†ตํ•ด ์ „์—ญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
=> ํ•˜์ง€๋งŒ ๋ฌด์กฐ๊ฑด ์ „์—ญ ์ƒํƒœ๋ผ๊ณ  ํ•  ์ˆ˜ ์—†๋‹ค. Proivder์—์„œ ์–ด๋–ค ๊ฐ’์„ ์ฃผ์ž…ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ๋ถ€๋ถ„ ์ „์—ญ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.


์ถœ์ฒ˜

(2) context API ํ•„์ˆ˜๊ฐœ๋… ๐Ÿ“Œ

createContext : context๋ฅผ ์ƒ์„ฑ
useContext : context๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ํ•ด๋‹น context์˜ ํ˜„์žฌ ๊ฐ’์„ ์ฝ์Œ
Provider : context๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ „๋‹ฌ

02. ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

(1) useContext๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ

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๋ฅผ ์จ์ค€๋‹ค.

(2) useContext๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ

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

    import { createContext } from "react";
    
    // ์—ฌ๊ธฐ์„œ null์€ ์ดˆ๊ธฐ๊ฐ’!
    export const FamilyContext = createContext(null);
  2. 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;
  3. Father.jsx ์ˆ˜์ • (props ์ซ“์•„๋‚ด๊ธฐ)

    import React from "react";
    import Child from "./Child";
    
    function Father() {
      return <Child />;
    }
    
    export default Father;
  4. 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;

03. ์ฃผ์˜ํ•ด์•ผ ํ•  ์‚ฌํ•ญ

๋žœ๋”๋ง ๋ฌธ์ œ

๐Ÿšซ ๋Š˜ re-rendering issue๋ฅผ ์ฃผ์˜

useContext๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, Provider์—์„œ ์ œ๊ณตํ•œ value๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค๋ฉด useContext๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋žœ๋”๋ง ๋œ๋‹ค.
๐Ÿ’ฅ ๋”ฐ๋ผ์„œ value ๋ถ€๋ถ„์„ ํ•ญ์ƒ ์‹ ๊ฒฝ์จ์ค˜์•ผํ•œ๋‹ค.

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