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๋ก ๋ฐ์ ์ํ์ ํ์์๋ง ๋ฆฌ๋ ๋๋ง ๋ฉ๋๋ค.
(๊ทธ๋๋ ์ชผ๊ฐค ์ ์๋ ๊ฑด ์ต๋ํ ์ชผ๊ฐ๋ ๊ฒ ์ข์ ๋ฏ์ถ๋ค.)
'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 |