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.
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 />);

