Redux owned a decade of React and now lives as legacy across most new projects. Zustand, Jotai, and signals cut re-render costs to levels the context API never reached. This guide compares the three models through render benchmarks and selection criteria by application type.
Does Redux still earn its place in 2026?
It does, in large teams that value mature devtools with time-travel, the middleware ecosystem, and patterns the framework enforces. Boilerplate shrank with createSlice and RTK Query, which cover mutations and cache without extra ceremony. Discipline remains mandatory: a subscription through a bad selector triggers re-render storms.
How does Zustand work?
One store, hooks as selectors, zero providers, and no dispatch. Each component subscribes to the slice it uses, with equality functions (shallow from zustand/shallow) controlling re-renders down to the field level. The package weighs a bit over 1 kB minified, and the persist middleware handles localStorage sync in two lines.
When do Jotai atoms shine?
Jotai builds state bottom-up: derived atoms compute from other atoms, and async atoms suspend through native React Suspense. The model handles complex dependent state such as multi-step form wizards and combinatorial live filters. When derivation dominates the domain, Jotai saves code and bugs.
Do signals fix the re-render problem?
Signals bring fine-grained reactivity: an update touches the exact DOM node and skips component re-renders altogether. Solid.js proves the model in production, Preact ships signals in its public API, and React resists integration while the TC39 proposal advances. Interop friction with React exists today, so the bet needs per-project evaluation.
What does the render benchmark say?
A table with 10k rows updating one cell: context-based state rerenders the page, Zustand with selectors rerenders the row, signals update the cell. Commit-time differences reach orders of magnitude. The longer the list and the more frequent the writes, the wider the gap between models.
Which one fits your project?
- Server state dominates? TanStack Query carries the weight while client state shrinks to UI concerns
- General case? Zustand as the pragmatic default
- Chained derivations everywhere? Jotai
- Render performance is contractual (real-time dashboards, editors)? Signals where the stack allows
How do you migrate without a big bang?
Coexistence works: turn context providers into Zustand stores one domain per PR. Keep Redux where devtools workflows are part of how the team debugs. Adopt signals per island in hybrid pages, starting with the components that update most.
Enjoyed this content?
I build web products and AI solutions the right way — solid architecture, maintainable code, and real delivery.
Let's talk