Difference Between useState and useReducerHook

Last Updated : 23 Jul, 2025

React offers powerful tools, like useState for simple tasks, making it a friendly companion, and useReducer for complex challenges, functioning like a superhero team. While both manage information, useState is ideal for everyday simplicity, resembling a sticky note, while useReducer shines in intricate scenarios, handling simultaneous complex tasks. The choice between them depends on the nature of your website's needs and the level of complexity involved.

useState Hook

The useState hook is used to manage the state in a functional component. A basic hook allows you to declare a state variable and a function to update it.

Syntax

const [state, setState] = useState(initialState);
  • state: The current state value.
  • setState: A function that allows you to update the state.
CSS
/* Write CSS Here */

.App {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
}

body {
    background-color: rgb(254, 226, 190);
}

.App>h2 {
    text-align: center;
}

.App>button {
    width: 8rem;
    font-size: larger;
    padding: 2vmax auto;
    height: 1.8rem;
    color: white;
    background-color: rgb(34, 34, 33);
    border-radius: 10px;
}

button:hover {
    background-color: rgb(80, 80, 78);
}
JavaScript
import React, { useState } from "react";
import "./App.css";

const App = () => {
    const [num, setNum] = useState(0);
    const handleClick = () => {
        setNum(num + 1);
    };

    return (
        <div className="App">
            <h2> {num}</h2>
            <button onClick={handleClick}>Add one</button>
        </div>
    );
};

export default App;

Output

onClickevent2GIF
useState Hook

useReducer Hook

The useReducer hook is like the superhero of state management. It brings a more advanced toolkit to the table, allowing you to tackle complex state logic with finesse. Its real magic shines through when you're dealing with state transitions that hinge on knowing what happened in the previous state. It's basically your go-to when things start getting a bit tricky.

Syntax

const [state, dispatch] = useReducer(reducer, initialState);
  • state: The current state value.
  • dispatch: A function that allows you to trigger state transitions by dispatching actions.
  • reducer: A function that specifies how the state should change in response to dispatched actions.
CSS
.App {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
}

body {
    background-color: rgb(254, 226, 190);
}

.App>h2 {
    text-align: center;
}

.App>button {
    width: 8rem;
    font-size: larger;
    padding: 2vmax auto;
    height: 1.8rem;
    color: white;
    background-color: rgb(34, 34, 33);
    border-radius: 10px;
}

button:hover {
    background-color: rgb(80, 80, 78);
}
JavaScript
// App.js
import "./App.css";
import Counter from "./components/Counter";

function App() {
    return (
        <>
            <Counter />
        </>
    );
}
export default App;
JavaScript
import React, { useReducer } from "react";

const initialState = { count: 0 };
function reducer(state, action) {
    switch (action.type) {
        case "increment":
            return {
                count: state.count + 1,
            };
        default:
            return state;
    }
}
function Counter() {
    const [state, dispatch] = useReducer(reducer, initialState);

    return (
        <div className="App">
            <h2>{state.count}</h2>
            <button
                onClick={() =>
                    dispatch({
                        type: "increment",
                    })
                }
            >
                Add One
            </button>
        </div>
    );
}

export default Counter;

Output

onClickevent2GIF
useReducer Hook

When to use useState?

  • For simple state management with independent updates.
  • When the state transitions are not complex and do not depend on the previous state.
  • When dealing with a single piece of state.

When to use useReducer?

  • For more complex state logic.
  • When state transitions depend on the previous state.
  • When managing multiple related pieces of state.

Difference Between useReducer and useState hook

Feature

useState

useReducer

Complexity

Simple and straightforward.

More complex, suitable for intricate state transitions.

Use Case

Ideal for independent state updates.

Suitable for managing complex state logic, especially when transitions depend on the previous state.

Syntax

const [state, setState] = useState(initialState);

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

State Logic

Limited for simple state scenarios.

Allows for centralized state transition logic using a reducer function.

Dependencies

No dependencies on the previous state.

Can take advantage of the previous state in the reducer function.

Performance

Generally performs well for simple scenarios.

Can be more optimal for complex state logic by preventing unnecessary re-renders.

Comment