๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

[React] context API (2023.05.22) ๋ณธ๋ฌธ

full stack/React

[React] context API (2023.05.22)

Shinjio 2023. 5. 22. 19:53

๐ŸŽˆ context API ์“ฐ๋Š” ์ด์œ 

๐Ÿ“– props์˜ ๋‹จ์ 

๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„

 

 

์œ„์™€ ๊ฐ™์€ ๋ฐ์ดํŠธ ํ๋ฆ„์„ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ (one-way reactive data flow)์ด๋ผํ•˜๊ณ 

react๋Š” ์ด๋Ÿฌํ•œ ํ๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

 

๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์žฅ์ 

1. ๊ด€๋ฆฌ์— ์šฉ์ดํ•จ

2. DOM๊ณผ์˜ ๊ถํ•ฉ - tree๊ตฌ์กฐ์˜ dom ๊ตฌ์กฐ์— ์œ ๋ฆฌํ•จ 

 

๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ๋‹จ์ 

์ž์‹์š”์†Œ์—์„œ ๋ถ€๋ชจ์š”์†Œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Œ

 

โš™๏ธ ๋ถ€๋ชจ์š”์†Œ๊ฐ€ ์ž์‹์š”์†Œ์˜ ๊ฐ’์„ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

 

๊ท€์ฐฎ๋‹ค >> contextAPI๋ฅผ ์‚ฌ์šฉํ•จ

 

๐ŸŽˆ context API

๐Ÿ“– context API ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

 

props๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

 

 

๋ฐ์ดํ„ฐ๋ฅผ ๋”ฐ๋กœ ๋ณด๊ด€ํ•˜์—ฌ ๋Œ์–ด๋‹ค ์“ฐ๋Š” ๋ฒ• >> Context API

 

 

์žฅ์  : ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

๋‹จ์  : ์ฝ”๋“œ ์ž‘์„ฑ์ด ์–ด๋ ต๋‹ค

 

 /*    Context๋ž€?     
๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๊ฐ’์„ ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ   

Q. Props๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋Š”?   
A. ๊นŠ์ˆ™ํ•˜๊ฒŒ ์œ„์น˜ํ•œ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•  ๊ฒฝ์šฐ,       
    ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์— ์—ฐ๋‹ฌ์•„ Props๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ       
     >> ๋ถˆํŽธํ• ๋ฟ๋”๋Ÿฌ ์‹ค์ˆ˜๊ฐ€ ์žฆ์Œ       
     >> ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ Props Drilling์ด๋ผ๊ณ  ํ•จ   
           ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” context๋กœ ์ƒํƒœ๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด ์ค„ ๊ฒƒ!   

** ๋งŒ๋“œ๋Š” ์ˆœ์„œ!   
1. context๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. (context๋Š” ํ•˜๋‚˜์˜ ๋ณด๊ด€ํ•จ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋จ) - createContext => export   
2. context๋ฅผ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ์— import   
3. ์ปดํฌ๋„ŒํŠธ๋ฅผ Context Provider๋กœ ๊ฐ์‹ธ์ค€๋‹ค. - ์ œ๊ณตํ•˜๋Š” ์—ญํ•    
4. ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ปดํฌ๋„ŒํŠธ์—์„œ useContext ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.     */

 

 

** ์˜ค๋ฅ˜ ์ข…๋ฅ˜ 
1) useState is not defined or useContext is not defined 
- import ๋ฅผ ์•ˆํ–ˆ๊ฑฐ๋‚˜ ์˜คํƒ€๊ฐ€ ๋‚œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

2) [Object Object] .. ๊ฐ์ฒด ์•ˆ์— ์ž‘์„ฑ์„ ํ•ด์•ผํ•˜๋Š”๋ฐ ์ค‘๊ด„ํ˜ธ๋ฅผ ์•ˆ์“ด ๊ฒฝ์šฐ 

3) npm start ๊ฐ€ ์•ˆ๋ผ์š” => ๊ฒฝ๋กœ ๋‹ค์‹œ ํ™•์ธํ•˜๊ธฐ

4) 'ThemeContext' ๋ผ๋Š” ์ด๋ฆ„์˜ context ํŒŒ์ผ์ด ํ•˜๋‚˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค - createContext ์šฉ๋„ 
   => ์ด๋ฆ„์€ ๋‹ฌ๋ผ๋„ ๋จ 

 

๐ŸŽˆ context API ์‚ฌ์šฉํ•˜๊ธฐ

1. context.js ํŒŒ์ผ ์ƒ์„ฑ

import { createContext } from "react";
// context ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ react์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ

export const DarkModeContext = createContext(null);


2. ์ฝคํผ๋„ŒํŠธ์— context import ๋ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ provider๋กœ ๊ฐ์‹ธ๊ธฐ

 

import React from 'react'
import Ex03Header from './components/Ex03Header'
import Ex03Main from './components/Ex03Main'
import { DarkModeContext } from './context/Ex03DarkMode'

const Ex03 = () => {
  return (
    <DarkModeContext.Provider>
      <div>
          <Ex03Header/>
          <Ex03Main/>
      </div>
    </DarkModeContext.Provider>

  )
}

export default Ex03

 

3. provider value๊ฐ’ ์„ค์ •

- value๊ฐ’์€ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ 

- useState ํ™œ์šฉํ•˜์—ฌ ๋ณ€ํ•˜๋Š” ๊ฐ’์„ value ๊ฐ’์œผ๋กœ ์ง€์ •

 

import React, { useState } from 'react'
import Ex03Header from './components/Ex03Header'
import Ex03Main from './components/Ex03Main'
import { DarkModeContext } from './context/Ex03DarkMode'

const Ex03 = () => {

  //main์—์„œ ๋ฒ„ํŠผ ํด๋ฆญ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜์—ฌ header๋กœ ์ „์†ก
  //๋ฒ„ํŠผ ํด๋ฆญ์—ฌ๋ถ€ : ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ
  const[isDark, setIsDark] = useState(false);

  return (
    <DarkModeContext.Provider value={{isDark, setIsDark}}>
      <div>
          <Ex03Header/>
          <Ex03Main/>
      </div>
    </DarkModeContext.Provider>

  )
}

export default Ex03

 

4. ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ปดํฌ๋„ŒํŠธ์—์„œ useContext ์‚ฌ์šฉ

 

import React, { useContext } from 'react'
import { DarkModeContext } from '../context/Ex03DarkMode'

const Ex03Main = () => {

  const{setIsDark} = useContext(DarkModeContext)

  return (
    <div>Ex03Main
        <button onClick={()=>{setIsDark(true)}}>๋‹คํฌ๋ชจ๋“œ</button>
    </div>
  )
}

export default Ex03Main