State 로직을 Reducer로 작성하기

한 컴포넌트에서 State 업데이트가 여러 이벤트 핸들러로 분산되는 경우가 있습니다. 이 경우 컴포넌트를 관리하기 어려워집니다. 따라서, 문제 해결을 위해 State를 업데이트하는 모든 로직을 Reducer를 사용해 컴포넌트 외부의 단일 함수로 통합해 관리할 수 있습니다.

학습 내용

  • Reducer 함수란 무엇인가
  • useState에서 useReducer로 리팩토링 하는 방법
  • Reducer를 언제 사용할 수 있는지
  • Reducer를 잘 작성하는 방법

Reducer를 사용하여 State 로직 통합하기

컴포넌트가 복잡해지면 컴포넌트의 State가 업데이트되는 다양한 경우를 한눈에 파악하기 어려워질 수 있습니다. 예를 들어, 아래의 TaskApp 컴포넌트는 State에 tasks 배열을 보유하고 있으며, 세 가지의 이벤트 핸들러를 사용하여 task를 추가, 제거 및 수정합니다.

import { useState } from 'react';
import AddTask from './AddTask.js';
import TaskList from './TaskList.js';

export default function TaskApp() {
  const [tasks, setTasks] = useState(initialTasks);

  function handleAddTask(text) {
    setTasks([...tasks, {
      id: nextId++,
      text: text,
      done: false
    }]);
  }

  function handleChangeTask(task) {
    setTasks(tasks.map(t => {
      if (t.id === task.id) {
        return task;
      } else {
        return t;
      }
    }));
  }

  function handleDeleteTask(taskId) {
    setTasks(
      tasks.filter(t => t.id !== taskId)
    )