The Subtle Art of State Management Without Redux or Zustand



This content originally appeared on DEV Community and was authored by Anish

State management is the frontend engineer’s favorite battleground. Every team has a war story:

  • Too much prop drilling
  • Context providers everywhere
  • Redux boilerplate bigger than the app itself

I’ve seen teams spend weeks debating whether to use Redux, Zustand, MobX, or Context.

But here’s the thing: you don’t always need a library. With careful patterns, React’s built-ins can take you surprisingly far.

  • Start with useState

Most apps don’t need global state. Local useState is the simplest, fastest, and most debuggable tool.

Use State

When state doesn’t need to escape a component, keep it there.

  • Reach for useReducer for Complex State

Use Reducer

This makes logic predictable without extra libraries.

  • Context Splitting Beats Prop Drilling

Context is powerful but easy to misuse. Instead of one giant provider, split contexts by domain.

Context Markdown

This way, auth updates don’t re-render the entire dashboard, and theme changes don’t ripple unnecessarily through profile components.

AuthContext

Scoped contexts = faster renders.

Now only auth-related consumers re-render when the auth state changes.

  • Add Undo/Redo with a Custom Hook

Sometimes you want time-travel state without Redux. Hooks can do it in a few lines.

History Redux

Now you’ve got a mini Redux with history baked in.

The Big Takeaway

Every abstraction has a cost. Before reaching for Zustand or Redux, ask yourself if you can solve the problem with a combination of useState, useReducer, and a few smart contexts. Most of the time, you can.

“Good state management is like good design—it disappears into the background.”

💬 Curious: how far have you pushed React’s built-ins before you needed a state library? Drop your war stories—I’d love to hear them.


This content originally appeared on DEV Community and was authored by Anish