Front-End/React

React] Hook : useContext ๋‹จ์  ํ•ด๊ฒฐ

์™•๊ฐ€๐Ÿ‘ 2023. 6. 26. 15:15
728x90
๋ฐ˜์‘ํ˜•

useContext

2023.06.23 - [Front-End/React] - React] Hook : useContext

 

์•ž ๊ฒŒ์‹œ๊ธ€์—์„œ ์–˜๊ธฐํ–ˆ๋˜ useContext์˜ ๋‹จ์ ์€ ๋ฆฌ๋ Œ๋”๋ง์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

 


 

 

์˜ˆ

 

์•ž์— ์˜ˆ๋ฅผ ๋“ค์—ˆ๋˜ ๋งˆํŠธ ์ฝ”๋“œ์—์„œ๋Š” 2์ธต ๊ณผ์ผ, 3์ธต ์Œ๋ฃŒ์ˆ˜๋กœ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค/

๋งŒ์•ฝ addDrink๋ฟ๋งŒ ์•„๋‹ˆ๋ผ addFruit๋ฅผ context์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ ,

์ด๋ฅผ Emart2F๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด,

addFruit ํ•˜๊ฒŒ ๋  ๋•Œ Emart3F๋„ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ํ˜„์ƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 


 

 

Emart.js

import React, { useState, useContext } from "react";
import Emart3F from "./Emart3F";
import Emart2F from "./Emart2F";
import { DrinkProvider, FruitsContext } from "./AppContext";

function Emart() {
  const martFruits = useContext(FruitsContext);
  const [fruits, setFruits] = useState(martFruits);

  const addFruit = (newFruit) => {
    setFruits({ ...fruits, fruits: [...fruits.fruits, newFruit] });
    console.log(newFruit.name + "๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
  };

  return (
    <div>
      <h2>์ด๋งˆํŠธ</h2>
      <FruitsContext.Provider value={{ fruits, addFruit }}>
        <Emart2F></Emart2F>
      </FruitsContext.Provider>

      <DrinkProvider>
        <Emart3F></Emart3F>
      </DrinkProvider>
    </div>
  );
}

export default Emart;

 

๊ธฐ์กด ์ฝ”๋“œ๋Š” App์—์„œ ์ž‘์„ฑํ•˜์˜€๋Š”๋ฐ, 2์ธต 3์ธต ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด Emart์ปดํฌ๋„ŒํŠธ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

Fruit๋Š” ๊ธฐ์กด ์†Œ์Šค์™€ ๋™์ผํ•˜๊ฒŒ ์ถ”๊ฐ€์ž‘์„ฑ ํ•˜์˜€๊ณ , Drink๋Š” ์ƒˆ๋กœ Provider๋ฅผ ์ •์˜ํ•ด ์คฌ์Šต๋‹ˆ๋‹ค.

์™œ๋ƒ๋ฉด, Emart์ปดํฌ๋„ŒํŠธ์—  ๊ธฐ์กด๊ณผ ๊ฐ™์ด ๋„ฃ๊ฒŒ ๋˜๋ฉด,

addFruit ํ–ˆ์„ ๋•Œ, setFruits๊ฐ€ ์‹คํ–‰๋˜์–ด state๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋˜๋ฉด์„œ ์ „์ฒด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์‹œํ–‰ํ•ด์•ผ ๋˜๊ณ ,

์ฐจ์ด์ ์„ ๋ณด๊ธฐ ์œ„ํ•ด Fruit๋Š” ๊ธฐ์กด ๋ฐฉ์‹, Drink๋Š” ๋ถ„๋ฆฌ๋œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

Emart3F.js

import React, { useContext } from "react";
import { DrinkContext } from "./AppContext";

function Emart3F() {
  const newDrink = { name: "HOT6", price: "1500" };
  const { drink, setDrink } = useContext(DrinkContext);

  const addDrink = (newDrink) => {
    setDrink({ ...drink, drink: [...drink.drink, newDrink] });
    console.log(newDrink.name + "๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
  };
  console.log("3์ธต");

  return (
    <div>
      <h3>์ด๋งˆํŠธ 3์ธต</h3>
      <div>
        ์Œ๋ฃŒ์ˆ˜
        {drink?.drink.map((item, index) => {
          return (
            <div key={index}>
              {item.name} : {item.price}์›
            </div>
          );
        })}
        <button onClick={() => addDrink(newDrink)}>์Œ๋ฃŒ ํ’ˆ๋ชฉ ์ถ”๊ฐ€</button>
      </div>
    </div>
  );
}

export default Emart3F;

 

2์ธต ์†Œ์Šค๋Š” ๊ธฐ์กด Emart3F ์ปดํฌ๋„ŒํŠธ์™€ ๋™์ผํ•˜๊ณ , Emart3F๋ฅผ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

drink์™€ setDrink๋ฅผ useContext๋กœ ๋ฐ›๊ณ , addDrinkํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด setDrink๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌ๋ฉด Emart3F ์•ˆ์—์„œ ๋™์ž‘ํ•˜์—ฌ ์žฌ์ •์˜ํ•œ DrinkProvider๊ฐ€ ๋™์ž‘ํ•˜๋ฉด์„œ DrinkContext๊ฐ’์ด ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

AppContext.js

import React, { useState, createContext } from "react";

const initialDrink = {
  drink: [
    { name: "Powerade", price: "1800" },
    { name: "Coca Cola", price: "1100" }
  ]
};

const initialFruits = {
  fruits: [
    { name: "Apple", price: "3500" },
    { name: "Grape", price: "6000" }
  ]
};

export const DrinkContext = createContext(initialDrink);
export const FruitsContext = createContext(initialFruits);

export function DrinkProvider({ children }) {
  const [drink, setDrink] = useState(initialDrink);

  return (
    <DrinkContext.Provider value={{ drink, setDrink }}>
      {children}
    </DrinkContext.Provider>
  );
}

 

createContextํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์ด๊ณ , drink๋ถ€๋ถ„์—์„œ state๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด, DrinkProvider๋ฅผ ์žฌ์ •์˜ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด Emart3F์—์„œ ์ผ์–ด๋‚˜๋Š” addDrinkํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด Emart3F์•ˆ์—์„œ state๊ฐ€ ๋ฐ”๋€Œ๊ณ ,

contexet์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— Emart3F ์ด์™ธ์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚  ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค.

 

ํ™•์ธ์€ ๋ฒ„ํŠผ ๋ˆŒ๋Ÿฌ์„œ console.log๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 


 

 

context๋ถ„๋ฆฌ ์™ธ์—๋„ React.memo๋‚˜ useMemo, useCallback์„ ํ™œ์šฉํ•ด์„œ ๊ฐ’์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•ด ๋†“์„ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
useReducer๋ฅผ ํ™œ์šฉํ•ด์„œ addDrink๋‚˜ addFruits ๊ฐ™์€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค๋„ ํ•จ๊ป˜ ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋” ์ข‹์„ ๋“ฏ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ๋„ ๋“ญ๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํ•™์Šตํ•˜๊ณ  ๊ธ€๋กœ ์ž‘์„ฑํ•ด ๋ดค๋Š”๋ฐ, ๊ฐœ์„ ํ•  ๊ฒƒ๋“ค์ด ๋งŽ์•„ ๋ณด์ด๋„ค์š”.

(useReducer๋ฅผ ๋งŽ์ด ์•ˆ ์จ๋ด ๊ฐ€์ง€๊ณ  ์ƒ๊ฐ์ด ์ž˜ ์•ˆ๋‚˜๋Š” ๋“ฏ...)

 

๋‚˜์ค‘์— ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐ์šฐ๋ฉด ์ž‘์€ ๊ฑด useContext, ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด Redux Toolkit์ด๋‚˜ Zustand, Recoil๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Redux Toolkit๋งŒ ์‚ฌ์šฉํ•ด ๋ดค๋Š”๋ฐ, ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋กœ ์ธํ•ด ์ƒํƒœ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋˜๋Š” ํ˜„์ƒ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

useContext๋Š” provider๋กœ ๊ฐ์‹ผ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ,
redux์˜ ๊ฒฝ์šฐ useSelector๋กœ ๋ฐ›์€ ์ปดํฌ๋„ŒํŠธํ•œ์—์„œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง ๋˜๊ฒŒ ๋œ๋‹ค.

๊ณ ๋กœ store(useContext์˜ ๊ฒฝ์šฐ๋Š” AppContext)์˜ ๊ทœ๋ชจ๊ฐ€ ์•„๋ฌด๋ฆฌ ์ปค๋„ useSelector๋กœ ๋ฐ›์€ ์ƒํƒœ์˜ ํ•œ์—์„œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.

(๊ทธ๋ž˜๋„ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๊ฑด ์ตœ๋Œ€ํ•œ ์ชผ๊ฐœ๋Š” ๊ฒŒ ์ข‹์„ ๋“ฏ์‹ถ๋‹ค.)

 

728x90

'Front-End > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

React] Hook : CustomHook  (0) 2023.06.26
React] Fragment <></>  (0) 2023.06.26
React] Hook : useContext  (0) 2023.06.23
React] Hook : useState ๋น„๋™๊ธฐ โ†’ ๋™๊ธฐ ํ•˜๋Š” ๋ฒ•  (0) 2023.06.22
React] Hook : useReducer  (0) 2023.06.22