๐ŸณReact | Reducer, useReducer

์›์˜ยท2023๋…„ 5์›” 16์ผ
1

์ƒˆ๋กœ์šด ์ง€์‹๐Ÿ’ก

๋ชฉ๋ก ๋ณด๊ธฐ
6/15

๐Ÿ”ŽReducer

๐Ÿ’ก๊ฐœ๋… ๋ฐ ์‚ฌ์šฉ์ด์œ 

  • ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์— ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ๋ชจ์•„๋†“์€ ๋‹จ์ผ ํ•จ์ˆ˜
  • ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์— Reducer ํ•จ์ˆ˜ ์ƒ์„ฑํ•ด state ๋ณ€๊ฒฝํ•˜๋Š” ๋กœ์ง ์ด๋™
  • state๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ useState๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ€๊ฒฝํ•จ์ˆ˜(setState)๋กœ ํ•ด์ฃผ๋ฉด,
    ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋กœ์ง์ด ์ ์  ๋งŽ์•„์ ธ์„œ ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง
  • ์ปดํฌ๋„ŒํŠธ์—์„œ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ๋ชจ๋“  ๋กœ์ง์— ์‰ฝ๊ฒŒ ์ ‘๊ทผ

๐Ÿ’ก์‚ฌ์šฉํ•˜๊ธฐ

useReducer

  • ์ปดํฌ๋„ŒํŠธ์— Reducer๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” React Hook

1. useState ๋Œ€์‹ ํ•ด์„œ useReducer ์„ ์–ธํ•˜๊ธฐ

// useState ์‚ฌ์šฉ
const [state, setstate] = useState(initialArg);
// useReducer ๋กœ ๋ณ€๊ฒฝ
const [state, dispatch] = useReducer(reducer, initialArg)


const initialArg = { age: 42 }

2. dispatch ํ†ตํ•ด ์ƒํƒœ ์ „๋‹ฌํ•˜๊ธฐ

  • dispatch({์ „๋‹ฌํ• ๊ฐ์ฒด}) ํ˜•ํƒœ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋Š” ๊ฐ์ฒด๋ฅผ action์ด๋ผ๊ณ  ๋ถ€๋ฆ„
  • action ๊ฐ์ฒด๋Š” ์–ด๋–ค ํ˜•ํƒœ๊ฐ€ ๋˜๋“  ์ƒ๊ด€์—†์ง€๋งŒ,
    ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ์กฐ๊ฑด์ผ๋•Œ ์‹คํ–‰ํ•  ์ง€ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ž์—ด์„ type์œผ๋กœ ์ง€์ •,
    ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ์—๋Š” ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ „๋‹ฌ
dispatch({ type: 'added', ex:'ex1', num: 123 })
dispatch({ type: 'deleted', ex:'ex2' })

3. Reducer ํ•จ์ˆ˜ ์ž‘์„ฑ

  • Reducer ํ•จ์ˆ˜
    - ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ์ง ๋“ค์–ด๊ฐ
    - 2๊ฐœ์˜ ์ธ์ž : ํ˜„์žฌ์ƒํƒœ(state), ์•ก์…˜ ๊ฐ์ฒด(action)
    - ๋ฆฌํ„ด๊ฐ’ : ๋ณ€๊ฒฝ๋œ state
  • ์•ก์…˜ ๊ฐ์ฒด ์•ˆ์˜ type์— ๋”ฐ๋ผ์„œ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ๊ฐ’์„ ๊ฒฐ์ • - ์ผ๋ฐ˜์ ์œผ๋กœ switch๋ฌธ ์‚ฌ์šฉ
  • ํ˜„์žฌ์ƒํƒœ state๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ๋„ Reducer ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
function exReducer(state, action) {
  switch (action.type) {
    case 'added': {
      // type์ด 'added'์ผ ๋•Œ ์‹คํ–‰ํ•  ๋กœ์ง

      // ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น
      const { ex, num } = action;
      return {
        // ...
        // ๋ฆฌํ„ดํ•  ๋ณ€๊ฒฝ๋œ state ์ž‘์„ฑ
        // ex = 'ex1', num = 123
      };
    }
    case 'deleted': {
      // type์ด 'deleted'์ผ ๋•Œ ์‹คํ–‰ํ•  ๋กœ์ง
      return {
        // ...
        // ๋ฆฌํ„ดํ•  ๋ณ€๊ฒฝ๋œ state ์ž‘์„ฑ
        // action.ex = 'ex2'
      };
    }
    default: {
      throw Error(`์•Œ์ˆ˜์—†๋Š” ์•ก์…˜ ํƒ€์ž…: ${action.type}`);
    }
  }
}

๐Ÿ’กuseState vs useReducer

  • useState๊ฐ€ Reducer ํ•จ์ˆ˜ , dispatch , action ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ผ์„œ ์ฒ˜์Œ์—๋Š” ์ฝ”๋“œ์–‘์ด ์ ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋งŽ์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ƒ๊ธฐ๊ณ  ์ƒํƒœ๋ฅผ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ, useReducer์˜ ์ฝ”๋“œ์–‘์ด ๋” ์ ์–ด์ง
  • ๊ฐ€๋…์„ฑ ์—ญ์‹œ ์ฝ”๋“œ์–‘์ด ๋Š˜์–ด๋‚  ์ˆ˜๋ก useReducer์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ข‹์Œ
    => ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ด๋–ค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋ผ ํ•œ๋ˆˆ์— ํŒŒ์•… ๊ฐ€๋Šฅ
profile
ํ™”์ดํŒ…~~^ใ…^/

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