[๐Ÿ’ŽReact] useContext๋Š” ์–ธ์ œ ์จ์•ผํ• ๊นŒ?

h-a-n-aยท2023๋…„ 4์›” 30์ผ
0

๐Ÿ’ŽReact

๋ชฉ๋ก ๋ณด๊ธฐ
12/14

Why ContextAPI?

props drilling ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๊ณ , ์–ด๋””์„œ๋“  ํŠน์ •ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ useContext ํ›…์ด ์žˆ๋‹ค. ์ƒํƒœ๊ด€๋ฆฌ ๋„๊ตฌ๋Š” ์•„๋‹ˆ๊ณ , ๊ทธ์ € ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค!(Redux๋Š” ์ƒํƒœ๊ด€๋ฆฌ๊นŒ์ง€ ๊ฐ€๋Šฅ)

how to use it

๋ณดํ†ต src/context ํด๋”๋ฅผ ๋”ฐ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์•ˆ์— context provider components๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. (App.jsx์— ์จ๋„ ๋˜๊ธดํ•˜์ง€๋งŒ, ๊ณต์œ ํ•ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๋ฉด App.jsx์— ๋กœ์ง์ด ๋„ˆ๋ฌด ๋งŽ์•„์ง€๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—)
๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ ์š”์†Œ ์™ธ๋ถ€์— ์ƒ์„ฑํ•ด ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ์„ ์žŠ์ง€ ๋ง์ž.

//src/context/MemeContext.tsx
const {createContext,useState} from 'react'

export const MemeContext=createContext(null) 
// context๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  Provider๋กœ ๋ž˜ํ•‘ํ•ด์ฃผ๋ฉด ์ด๊ฒƒ์ด ๊ฐ์‹ผ ๋ชจ๋“  ๊ณณ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„์“ธ์ˆ˜์žˆ๋‹ค.
export const MemeContextProvider=({children})=>{ 
  const [isToggle,setIsToggle]=useState(false)
  const value={isToggle,setIsToggle}
  return(
    <MemeContext.Provider value={value}>{children}</MemeContext.Provider>
   )
}

๊ทธ ๋‹ค์Œ contextProvider๋กœ ์ตœ์ƒ์œ„ App.tsx๋ฅผ ๋ž˜ํ•‘ํ•˜๋ฉด ๋!

// src/App.tsx
import { MemeContextProvider } from './context/MemeContext';
function App() {
  return (
    <MemeContextProvider>
     ๋ณธ๋ฌธ์ž…๋‹ˆ๋‹ค
    </MemeContextProvider>
  );
}

export default App;
                                    

drawback of ContextAPI

์ง€๊ธˆ์€ isToggle,setIsToggle๋ฐ–์— ์•ˆ์ผ์ง€๋งŒ, ๋งŒ์•ฝ context๋‚ด ๋‹จ์ผ๊ฐ’๋งŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ ํ•ด๋„ ์ „์ฒด ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ธฐ์ˆ ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ํ•ด๋‹น context๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ๋‹ค ๋ Œ๋”๋ง๋˜๋ฉฐ ํ˜ธ์ถœ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์ด๋Š” ํ”„๋กœ์ ํŠธ์˜ ์†๋„์™€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋  ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” context์•ˆ์— ์ตœ๋Œ€ํ•œ ๋„ฃ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
isModalOpen,setIsModalOpen ๊ฐ™์€ ๊ฑธ ๋„ฃ์„ ๊ฒŒ ์•„๋‹ˆ๋ผ (๊ทธ๋™์•ˆ ์—ด์‹ฌํžˆ App.jsx์— modal ์˜คํ”ˆ์—ฌ๋ถ€ context์— ์ง‘์–ด๋„ฃ์—ˆ๋˜ ๋‚˜..๋ฐ˜์„ฑํ•ด...)

const [user,setUser]=useState(null)
const [isAuth,setIsAuth]=useState(false)

์œ„์™€ ๊ฐ™์ด ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ + ๊ฑฐ์˜ ๋ณ€๊ฒฝ๋  ์—ฌ์ง€๊ฐ€ ์—†๋Š” ๊ฒƒ๋“ค๋งŒ context ์•ˆ์— ๋„ฃ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ ์™ธ์˜ ๊ฑด ์ฐจ๋ผ๋ฆฌ props drilling ํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค.

๊ทธ๋ฆฌ๊ณ  context๋ฅผ ๊ผญ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค. ํ”„๋กœ์ ํŠธ ๋‚ด ๋กœ์ง์„ ์ƒ๊ฐํ•ด๋ณด๊ณ  ๊ทธ context๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ๋“ค๋งŒ ํ•ด๋‹น context๋กœ ๊ฐ์‹ธ๋„ ๋œ๋‹ค.(ProfileContext, PostsContext, FriendsContext,...) ๊ทธ์น˜๋งŒ ์ด๊ฒƒ ์—ญ์‹œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์—ฌ๋ถ€๋Š” ์–ด์ฉ” ์ˆ˜ ์—†๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์„ ์ตœ์†Œํ™”ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค!!
๊ทธ๋ž˜์„œ ๋‚˜์˜จ ๋Œ€์•ˆ๋“ค ์ค‘ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๊ฐ€ ๋ฐ”๋กœ redux, redux-toolkit, recoil, zustand ๋“ฑ์ด ์žˆ๋‹ค.

redux VS context API

<์ฐธ๊ณ >
PedroTech
์ค€ํ˜๊ณผ ์ปดํ“จํ„ฐ ํ‹ฐ์Šคํ† ๋ฆฌ

profile
ํ•˜๋ฃจํ•˜๋ฃจ๊ฐ€ ์—ฐ์Šต์ด๋‹ˆ ๋‚ด์ผ์€ ๋” ๊ฐ•ํ•ด์งˆ ๊ฒ๋‹ˆ๋‹ค

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