[React] useReducer

별이·2025λ…„ 2μ›” 21일

πŸ”Ž useReducerλž€?

React의 Hook 쀑 ν•˜λ‚˜λ‘œ, λ³΅μž‘ν•œ μƒνƒœ λ‘œμ§μ„ κ΄€λ¦¬ν•˜λŠ” 데 μ‚¬μš©λœλ‹€. useReducerλŠ” ν˜„μž¬ μƒνƒœμ™€ μƒνƒœλ₯Ό λ³€κ²½ν•˜κΈ° μœ„ν•œ 'μ•‘μ…˜'을 λ°›μ•„μ„œ μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

πŸ’‘ useState vs useReducer

useState와 useReducerλŠ” λͺ¨λ‘ Reactμ—μ„œ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” Hookμ΄μ§€λ§Œ, 각각 λ‹€λ₯Έ νŠΉμ„±κ³Ό μš©λ„λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

useState

  • κ°„λ‹¨ν•œ μƒνƒœ 관리에 적합 (단일 κ°’μ΄λ‚˜ κ°„λ‹¨ν•œ 객체)
  • 직관적이고 μ‚¬μš©ν•˜κΈ° 쉬움
  • μƒνƒœ λ³€κ²½ 둜직이 μ»΄ν¬λ„ŒνŠΈ 내뢀에 직접 μœ„μΉ˜
  • μ—¬λŸ¬ μƒνƒœκ°€ 독립적일 λ•Œ 적합

useReducer

  • λ³΅μž‘ν•œ μƒνƒœ 둜직 관리에 적합 (μ—¬λŸ¬ ν•„λ“œκ°€ μžˆλŠ” 객체)
  • μƒνƒœ λ³€ν™”μ˜ 예츑 κ°€λŠ₯성을 높이고, κ΄€λ ¨ λ‘œμ§μ„ ν•œ 곳에 λͺ¨μ„ 수 있음
  • μƒνƒœ λ³€κ²½ λ‘œμ§μ„ μ»΄ν¬λ„ŒνŠΈ μ™ΈλΆ€λ‘œ 뢄리 κ°€λŠ₯
  • μ—¬λŸ¬ μƒνƒœ μ—…λ°μ΄νŠΈκ°€ μ„œλ‘œ μ—°κ΄€λ˜μ–΄ μžˆμ„ λ•Œ 유용
  • μƒνƒœ λ³€ν™” νžˆμŠ€ν† λ¦¬ 좔적이 용이
  • ν…ŒμŠ€νŠΈν•˜κΈ° μ‰¬μš΄ 순수 ν•¨μˆ˜λ‘œ μƒνƒœ 둜직 관리

πŸ’‘ useReducer의 κΈ°λ³Έ ꡬ문

const [state, dispatch] = useReducer(reducer, initialState);
  • state : ν˜„μž¬ μƒνƒœ κ°’
  • dispatch : μ•‘μ…˜μ„ λ°œμƒμ‹œν‚€λŠ” ν•¨μˆ˜
  • reducer : ν˜„μž¬ μƒνƒœμ™€ μ•‘μ…˜μ„ λ°›μ•„ μƒˆλ‘œμš΄ μƒνƒœλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
  • initialState : 초기 μƒνƒœ κ°’

πŸ’‘ useReducer의 μ΄ˆκΈ°ν™” ν•¨μˆ˜(Init Function)

useReducerλŠ” μ„ νƒμ μœΌλ‘œ μ„Έ 번째 λ§€κ°œλ³€μˆ˜λ₯Ό 받을 수 μžˆλ‹€.

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

μ—¬κΈ°μ„œ init은 초기 μƒνƒœλ₯Ό κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. 이λ₯Ό 톡해 초기 μƒνƒœ 생성 λ‘œμ§μ„ λΆ„λ¦¬ν•˜κ³  μž¬μ‚¬μš©ν•  수 μžˆλ‹€.

// μ΄ˆκΈ°ν™” ν•¨μˆ˜
function init(initialCount) {
	return { count: initialCount };
}

// μ‚¬μš© μ˜ˆμ‹œ
const [state, dispatch] = useReducer(reducer, 0 , init);

이 νŒ¨ν„΄μ€ 초기 μƒνƒœκ°€ λ³΅μž‘ν•œ 계산이 ν•„μš”ν•˜κ±°λ‚˜, 이전 μƒνƒœλ₯Ό λ¦¬μ…‹ν•˜λŠ” μ•‘μ…˜μ΄ μžˆμ„ λ•Œ μœ μš©ν•˜λ‹€.

πŸ’‘ reducer ν•¨μˆ˜ μ΄ν•΄ν•˜κΈ°

function reducer(state, action) {
	switch (action.type) {
		case 'INCREMENT':
			return { ...state, count: state.count + 1 };
		case 'DECREMENT':
			return { ...state, count: state.count - 1 };
		default:
			return state;
    }
}

이 ν•¨μˆ˜λŠ” 두 κ°€μ§€ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›λŠ”λ‹€.
1. state : ν˜„μž¬ μƒνƒœ
2. action : μ–΄λ–€ λ³€ν™”λ₯Ό μΌμœΌν‚¬μ§€ λ‚˜νƒ€λ‚΄λŠ” 객체 (일반적으둜 type 속성을 포함)
reducer ν•¨μˆ˜λŠ” 항상 μƒˆλ‘œμš΄ μƒνƒœ 객체λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•˜λ©°, 원본 μƒνƒœλ₯Ό 직접 μˆ˜μ •ν•΄μ„œλŠ” μ•ˆλœλ‹€.

πŸ“š 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 };
      	case 'RESET':
        	return { count: 0 };
		default:
			return state;
    }
}

function Counter() {
	// useReducer μ‚¬μš©
  	const [state, dispatch] = useReducer(counterReducer, { count: 0 });
  
  	return (
    	<div>
      		<h1>카운트: {state.count}</h1>
			<button onClick={() => dispatch({ type: 'INCREMENT' })}>증가</button>
			<button onClick={() => dispatch({ type: 'DECREMENT' })}>κ°μ†Œ</button>
			<button onClick={() => dispatch({ type: 'RESET' })}>리셋</button>
      	</div>
    );
}
profile
πŸ’­

0개의 λŒ“κΈ€