DEV Community

Vidya
Vidya

Posted on

useState vs useReducer in React

What is useState?

useState is a React Hook that allows functional components to create and manage state. Before Hooks were introduced, state could only be managed inside class components. With useState, developers can store values such as numbers, strings, booleans, arrays, and objects directly inside functional components and update them whenever needed.

Whenever the state changes, React automatically re-renders the component and updates the UI with the latest data.

Syntax

const [state, setState] = useState(initialValue);
Enter fullscreen mode Exit fullscreen mode

--> state → Current value of the state.
--> setState → Function used to update the state.
--> initialValue → Initial value assigned to the state.

Example: Counter Application

import React, { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <h2>Count: {count}</h2>

      <button onClick={() => setCount(count + 1)}>
        Increment
      </button>
    </div>
  );
}

export default Counter;
Enter fullscreen mode Exit fullscreen mode

How it Works
=> useState(0) initializes the state with 0.
=> count stores the current value.
=> setCount() updates the value.
=> When the button is clicked, React re-renders the component with the updated count.

When to Use useState?

--> Counter applications
--> Show/Hide functionality
--> Theme switching
--> Simple forms
--> Managing a single piece of state

What is useReducer?

useReducer is a React Hook used for managing complex state logic. Instead of updating state directly, it uses a reducer function and actions to determine how the state should change.

It follows the same concept as Redux, where actions are dispatched and a reducer function decides the next state based on the action type.

useReducer is useful when a component has multiple state values or complex update logic.

Syntax


const [state, dispatch] = useReducer(reducer, initialState);
Enter fullscreen mode Exit fullscreen mode

=> state → Current state.
=> dispatch → Function used to send actions.
=> reducer → Function that handles state updates.
=> initialState → Initial state value.

Example: Counter using useReducer

import React, { useReducer } from "react";

const initialState = { count: 0 };

function reducer(state, action) {
  switch (action.type) {
    case "increment":
      return { count: state.count + 1 };

    case "decrement":
      return { count: state.count - 1 };

    default:
      return state;
  }
}

function Counter() {
  const [state, dispatch] = useReducer(
    reducer,
    initialState
  );

  return (
    <div>
      <h2>Count: {state.count}</h2>

      <button onClick={() =>
        dispatch({ type: "increment" })
      }>
        Increment
      </button>

      <button onClick={() =>
        dispatch({ type: "decrement" })
      }>
        Decrement
      </button>
    </div>
  );
}

export default Counter;
Enter fullscreen mode Exit fullscreen mode

How it Works

--> initialState stores the starting state.
--> reducer() receives the current state and action.
--> dispatch() sends an action.
--> The reducer decides how the state should change.
--> React re-renders the component with the updated state.

Real-World Example
Using useState

const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [age, setAge] = useState("");

Enter fullscreen mode Exit fullscreen mode

--> This is fine for a small form with a few fields.

Using useReducer

const initialState = {
  name: "",
  email: "",
  age: ""
};

function reducer(state, action) {
  switch (action.type) {
    case "UPDATE_NAME":
      return { ...state, name: action.payload };

    case "UPDATE_EMAIL":
      return { ...state, email: action.payload };

    case "UPDATE_AGE":
      return { ...state, age: action.payload };

    default:
      return state;
  }
}

Enter fullscreen mode Exit fullscreen mode

--> For large forms with validations and multiple updates, useReducer keeps the code cleaner and easier to maintain.

Top comments (0)