front/react

[react] React Hook 3 (useReducer)

๋ฐฐ๊ณ ํŒŒ์š” 2026. 1. 7. 10:03
728x90

๐Ÿ“ useReducer

  • ๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ(state) ๊ด€๋ฆฌ ํ›… ์ด๋‹ค.
  • useState ๋ณด๋‹ค ๋ณต์žกํ•œ ์ƒํƒœ ๋กœ์ง์„ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•จ.
  • -----------------------------------------------------------------------------------------
  • ๊ธฐ๋ณธ ๊ฐœ๋… ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
    • const [state, dispatch] = useReducer(reducer, initalState);
    • state : ํ˜„์žฌ ์ƒํƒœ ๊ฐ’
    • dispatch : ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด action ์„ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜
    • reducer : ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋กœ์ง์„ ๋‹ด์€ ํ•จ์ˆ˜
    • initialState : ์ดˆ๊ธฐ ์ƒํƒœ ๊ฐ’ --> ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋„ฃ๊ธฐ!
  • -----------------------------------------------------------------------------------------
  • useReducer ์˜ ํ•ต์‹ฌ์€ State ๋ฅผ ํ•œ ๊ณณ์— ๋ชจ์•„๋‘๊ณ  ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ!!
    • state : ์ฐฝ๊ณ  ์•ˆ์— ์ €์žฅ๋œ ํ˜„์žฌ ๋ฌผํ’ˆ ์ƒํƒœ
    • dispath : ์ฐฝ๊ณ  ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ณด๋‚ด๋Š” ์š”์ฒญ์„œ
    • action : ์š”์ฒญ์„œ์— ๋“ค์–ด๊ฐ€๋Š” ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ (์ถœ๊ณ , ์ž…๊ณ  ๋“ฑ๋“ฑ)
      • action์„ dispath ์— ๋‹ด์•„์„œ ๋ณด๋‚ธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ.
    • reducer : ์š”์ฒญ์„œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—… ์ง€์นจ์„œ ๋ฐ ์‹ค์ œ state ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ณ , ์ž…/์ถœ๊ณ  ๋“ฑ์˜ ์‹ค์ œ ์ž‘์—…์ด ๋ฐœ์ƒ ์žฌ๊ณ  ์ˆ˜๋Ÿ‰์˜ ๋ณ€ํ™” ๋“ฑ์„ ๋ฐœ์ƒ์‹œํ‚ด.
      • ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๋กœ์ง์ด ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„.
  • dispatch({type : "OUT", payload : inputValue})
    • ๊ฐ์ฒดํ˜•ํƒœ๋กœ ๋„ฃ์œผ๋ฉด ๋จ.
  • action.type , 
    action.payload ์™€ ๊ฐ™์ด action.~ ์œผ๋กœ ๊บผ๋‚ด๋ฉด ๋จ.
  • -----------------------------------------------------------------------------------------
  • ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ์—์„œ useReducer ์„ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ.
  • ๊ฐ๊ฐ์˜ useReducer ํ•˜๋‚˜ = ์ž‘์€ ์ƒํƒœ ๋จธ์‹  1๊ฐœ ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ.
    • ๋”๋ณด๊ธฐ
      ์ปดํฌ๋„ŒํŠธ
       โ”œโ”€ reducer A (์นด์šดํ„ฐ)
       โ”œโ”€ reducer B (์œ ์ €)
       โ””โ”€ reducer C (๋ชจ๋‹ฌ)
  • โญ•๏ธโญ•๏ธ ์„œ๋กœ ๋‹ค๋ฅธ ๊ด€์‹ฌ์‚ฌ(state) ๋ฅผ ๋ถ„๋ฆฌํ•  ๋•Œ. --> ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Œ.!
  • โŒโŒ ์ƒํƒœ๋“ค์ด ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด?? --> reducer๊ฐ€ ์„œ๋กœ ์–ฝํž˜. 
    • --> ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ํ•˜๋‚˜์˜ reducer ๋กœ ํ•ฉ์น˜๋Š” ๊ฒŒ ์ข‹์Œ.
    • ex) order ๊ณผ payment ์™€ ๊ฐ™์ด ์„œ๋กœ ์—ฐ๊ด€์„ฑ์ด ๋†’์€ ๊ฒฝ์šฐ๋Š” ๋”ฐ๋กœ ํ•ด์•ผ ํ•จ.
  • -----------------------------------------------------------------------------------------

 

๐Ÿ“ ํ’€์ฝ”๋“œ

import { useReducer, useState } from "react";
import { createRoot } from "react-dom/client";

function warehouseReducer(state, action) {
    /*
    switch(action.type) {
        case "IN" : return {...state, stock : state.stock + 1};
        case "OUT" : return {...state, stock : Math.max(0, state.stock - 1)};
        default : return state;
    }
    */
   switch(action.type) {
        case "IN" : return {...state, stock : state.stock + action.payload};
        case "OUT" : return {...state, stock : Math.max(0, state.stock - action.payload)};
        default : return state;
    }
}

function userReducer(user, action){
    switch(action.setName){
        case "Y" : {
            console.log( action.name ); 
            return { ...user, name : action.name } 
        };
        default : return user;
    }
    

}

function WareHouse() {
    const [state, dispatch] = useReducer(warehouseReducer, { stock : 0, cnt : 1 });
    const [inputValue, setInputValue] = useState(1);
    const userInitalState = { name : "ํ™๊ธธ๋™", age : 20 }; // userReducer ์— ๋„ฃ์„ ์ดˆ๊ธฐ๊ฐ’ ๊ฐ์ฒด!
    const [user, dispatchUser] = useReducer(userReducer, userInitalState );

    const handleChange = (e) => {
        let targetId = e.target.id;
        let targetVal = e.target.value;

        switch(targetId){
            case "stock" : {
                const val = parseInt(targetVal, 10);
                // 1. useState ์ด์šฉํ•ด๋ณด๊ธฐ.
                // setInputValue( isNaN(val) ? 0 : val );
                // 2. useReducer ์ด์šฉํ•ด๋ณด๊ธฐ.
                warehouseReducer( {cnt : targetVal} );
                console.log(state.cnt);
                break;
            }
            case "name" : {
                dispatchUser( {setName: "Y" ,name : targetVal} ); 
                break;
            }
            default : { console.log(`err ---- ${targetId}`); }
        };
        
    } 

    return (
        <div>
            <h1>์ฐฝ๊ณ  ์žฌ๊ณ  : {state.stock}</h1>
            <p>
                <input id="stock" type="number" value={inputValue} onChange={handleChange} placeholder="์ˆ˜๋Ÿ‰์ž…๋ ฅ" />
            </p>
            <button onClick={ () => dispatch({type : "IN", payload : state.cnt}) }>์ž…๊ณ </button>
            <button onClick={ () => dispatch({type : "OUT", payload : state.cnt}) }>์ถœ๊ณ </button>
        
            <p>
                <input id="name" type="text" value={user.name} onChange={handleChange} placeholder="์ˆ˜๋Ÿ‰์ž…๋ ฅ" />
            </p>
        </div>
    );
}


createRoot(document.getElementById('react4')).render(<WareHouse />);

 

๐Ÿ“ ?

  • ใ…‡ใ…‡ 

 

 

 

 

๐Ÿ“ ?

  • ใ…‡ใ…‡ 

 


์ถœ์ฒ˜ : 

 

 

 


๊ฐœ๋ฐœ ๊ณต๋ถ€๋ฅผ ์œ„ํ•œ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค. 

์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”! 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

728x90

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

[react] React Hook 5 (Custom Hook)  (0) 2026.01.07
[react] React Hook 4 (useCallback, useMemo)  (0) 2026.01.07
[react] React Hook 2 (useContext, useRef)  (0) 2026.01.06
[react] React Hooks 1 (useState, useEffect)  (0) 2026.01.04
[react] React Transition (useTransition)  (0) 2026.01.04