React useReducer Hook

The useReducer Hook in React works similarly to useState, but provides enhanced state management capabilities. It is especially useful for handling complex state transitions and multiple interdependent state variables.

Tutorials dojo strip

Syntax

The useReducer Hook takes two arguments:

useReducer(<reducerFunction>, <initialState>)
  • reducerFunction: Defines your state update logic.
  • initialState: Sets the starting state, typically an object.

The useReducer Hook returns an array containing the current state and a dispatch function to trigger state updates.

Example

This only covers the logic to monitor the completion status of a task.

All the logic for adding, deleting, and completing tasks can be included in a single useReducer Hook by incorporating additional actions.

import { useReducer } from "react";
import ReactDOM from "react-dom/client";

const initialTasks = [
  {
    id: 1,
    title: "Task 1",
    complete: false,
  },
  {
    id: 2,
    title: "Task 2",
    complete: false,
  },
];

const taskReducer = (state, action) => {
  switch (action.type) {
    case "TOGGLE_COMPLETE":
      return state.map((task) => {
        if (task.id === action.id) {
          return { ...task, complete: !task.complete };
        }
        return task;
      });
    default:
      return state;
  }
};

function TaskList() {
  const [tasks, dispatch] = useReducer(taskReducer, initialTasks);

  const handleToggle = (task) => {
    dispatch({ type: "TOGGLE_COMPLETE", id: task.id });
  };

  return (
    <>
      {tasks.map((task) => (
        <div key={task.id}>
          <label>
            <input
              type="checkbox"
              checked={task.complete}
              onChange={() => handleToggle(task)}
            />
            {task.title}
          </label>
        </div>
      ))}
    </>
  );
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<TaskList />);

Tutorials dojo strip
Scroll to Top