ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

web/react hook

useReducer

dev_been94 2024. 12. 14. 15:40
728x90
๋ฐ˜์‘ํ˜•

useReducer

 

๐ŸŽฏ useReducer๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

useReducer๋Š” ์ƒํƒœ(state)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์˜ˆ์š”.
React์—์„œ๋Š” ๋ณดํ†ต **useState**๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€๋งŒ, ์ƒํƒœ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉด ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์งˆ ์ˆ˜ ์žˆ์–ด์š”.
์ด๋Ÿด ๋•Œ **useReducer**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ๋ฅผ ๋” ์ฒด๊ณ„์ ์ด๊ณ  ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

๐Ÿงฉ useState์™€ useReducer ๋น„๊ตํ•˜๊ธฐ

๋จผ์ € useState๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณต์Šตํ•ด๋ณผ๊นŒ์š”?

import React, { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>์นด์šดํŠธ: {count}</p>
      <button onClick={() => setCount(count + 1)}>์ฆ๊ฐ€</button>
      <button onClick={() => setCount(count - 1)}>๊ฐ์†Œ</button>
    </div>
  );
}

 

์ด ์ฝ”๋“œ์—์„œ๋Š”

  • useState๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ˆซ์ž ํ•˜๋‚˜๋งŒ ๊ด€๋ฆฌํ•ด์š”.
  • ๊ฐ„๋‹จํ•˜๋‹ˆ๊นŒ useState๋กœ ์ถฉ๋ถ„ํ•˜์ฃ .

ํ•˜์ง€๋งŒ ์ƒํƒœ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ฑฐ๋‚˜ ๋‹ค์–‘ํ•œ ์•ก์…˜์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด?
์—ฌ๊ธฐ์„œ **useReducer**๊ฐ€ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค! ๐Ÿš€

 

๐Ÿ› ๏ธ useReducer ๊ธฐ๋ณธ ์˜ˆ์‹œ

**useReducer**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ์™€ ๊ทธ ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์š”.
๋จผ์ € ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์•Œ์•„๋ณผ๊นŒ์š”?

 

1. useReducer ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

const [state, dispatch] = useReducer(reducer, initialState);

 

  • reducer: ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€์ง€ ์ •์˜ํ•˜๋Š” ํ•จ์ˆ˜์˜ˆ์š”.
  • initialState: ์ƒํƒœ์˜ ์ดˆ๊ธฐ๊ฐ’์ด์—์š”.
  • dispatch: ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜์˜ˆ์š”.

 

2. ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ: ์นด์šดํ„ฐ ๋งŒ๋“ค๊ธฐ

์•„๊นŒ useState๋กœ ๋งŒ๋“ค์—ˆ๋˜ ์นด์šดํ„ฐ๋ฅผ useReducer๋กœ ๋‹ค์‹œ ๋งŒ๋“ค์–ด ๋ณผ๊ฒŒ์š”!

 

import React, { useReducer } from "react";

// ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€์ง€ ์ •์˜ํ•˜๋Š” reducer ํ•จ์ˆ˜
function reducer(state, action) {
  switch (action.type) {
    case "INCREMENT":
      return { count: state.count + 1 };
    case "DECREMENT":
      return { count: state.count - 1 };
    default:
      return state;
  }
}

function Counter() {
  const initialState = { count: 0 }; // ์ดˆ๊ธฐ ์ƒํƒœ
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <div>
      <p>์นด์šดํŠธ: {state.count}</p>
      <button onClick={() => dispatch({ type: "INCREMENT" })}>์ฆ๊ฐ€</button>
      <button onClick={() => dispatch({ type: "DECREMENT" })}>๊ฐ์†Œ</button>
    </div>
  );
}

export default Counter;

 

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  1. reducer ํ•จ์ˆ˜
    • reducer๋Š” ์ƒํƒœ(state)๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋กœ์ง์„ ๋ชจ์•„๋†“์€ ํ•จ์ˆ˜์˜ˆ์š”.
    • action.type์— ๋”ฐ๋ผ ์–ด๋–ค ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€์ง€ ๊ฒฐ์ •ํ•ด์š”.
    • ์˜ˆ๋ฅผ ๋“ค์–ด:
      • INCREMENT: count๋ฅผ +1 ์ฆ๊ฐ€์‹œ์ผœ์š”.
      • DECREMENT: count๋ฅผ -1 ๊ฐ์†Œ์‹œ์ผœ์š”.
  2. useReducer ํ›…
    • useReducer๋ฅผ ์‚ฌ์šฉํ•ด์„œ state(ํ˜„์žฌ ์ƒํƒœ)์™€ dispatch(์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜)๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  3. dispatch ํ•จ์ˆ˜
    • dispatch({ type: "INCREMENT" })์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•ด์„œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋•Œ type์€ ์–ด๋–ค ์•ก์…˜์ธ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ์—ญํ• ์„ ํ•ด์š”.

 

๐Ÿ• ์ƒ์  ์ด์•ผ๊ธฐ๋กœ ์ดํ•ดํ•˜๊ธฐ

์—ฌ๋Ÿฌ๋ถ„์ด ํ”ผ์ž ๊ฐ€๊ฒŒ๋ฅผ ์šด์˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ด์š”. ๐Ÿ•

  • state: ๊ฐ€๊ฒŒ์˜ ์ƒํƒœ (์˜ˆ: ํ”ผ์ž ์ˆ˜๋Ÿ‰ 10๊ฐœ)
  • action: ์–ด๋–ค ํ–‰๋™์ด ์ผ์–ด๋‚ ์ง€ (์˜ˆ: "ํ”ผ์ž ์ถ”๊ฐ€" ๋˜๋Š” "ํ”ผ์ž ํŒ๋งค")
  • reducer: ์ด ํ–‰๋™์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€์ง€ ์ •์˜ํ•˜๋Š” ๊ณณ์ด์—์š”.

ํ”ผ์ž ๊ฐ€๊ฒŒ์— ๋“ค์–ด์˜จ ์ฃผ๋ฌธ(์•ก์…˜)์„ dispatch์— ์ „๋‹ฌํ•˜๋ฉด,
reducer๊ฐ€ "ํ”ผ์ž๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ• ์ง€" ์•„๋‹ˆ๋ฉด "ํ•˜๋‚˜๋ฅผ ํŒ๋งคํ• ์ง€" ๊ฒฐ์ •์„ ๋‚ด๋ ค์š”.

 

๐Ÿงฉ useReducer๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ์š”?

  1. ์ƒํƒœ๊ฐ€ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๊ฐ’์„ ๊ด€๋ฆฌํ•  ๋•Œ
    • ์˜ˆ: ํ•  ์ผ ๋ชฉ๋ก ๊ด€๋ฆฌ, ์‡ผํ•‘๋ชฐ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋“ฑ
  2. ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ์ง์ด ํ•œ๊ณณ์— ๋ชจ์—ฌ ์žˆ์–ด์•ผ ํ•  ๋•Œ
    • ๋ชจ๋“  ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ์ง์ด reducer ์•ˆ์— ๋ชจ์—ฌ ์žˆ์œผ๋‹ˆ๊นŒ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ ธ์š”.
  3. ์—ฌ๋Ÿฌ ์•ก์…˜์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ
    • ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋™์ž‘(INCREMENT, DECREMENT, RESET ๋“ฑ)์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด useReducer๊ฐ€ ๊น”๋”ํ•ด์š”.

 

๐ŸŒŸ ์ •๋ฆฌํ•˜์ž๋ฉด!

useReducer๋Š” ์ƒํƒœ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€์ง€ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๋Š” ๋„๊ตฌ์˜ˆ์š”.
๋ณต์žกํ•œ ์ƒํƒœ์™€ ์—ฌ๋Ÿฌ ์•ก์…˜์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ useState๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ๊น”๋”ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋ฉ๋‹ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•

'web > react hook' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

useState  (0) 2024.12.14
useRef  (0) 2024.12.14
useOptimistic  (0) 2024.12.14
useMemo  (2) 2024.12.14
useLayoutEffect  (0) 2024.12.14
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•
250x250