React state management has evolved dramatically. Redux ruled for years, but Zustand and Jotai represent the modern approach: less boilerplate, smaller bundles, and better TypeScript support. Here's which one fits your app.
Quick Comparison
| Zustand | Redux Toolkit | Jotai | |
|---|---|---|---|
| Approach | Minimal global store (hooks) | Centralized store (actions/reducers) | Atomic state (bottom-up) |
| Bundle size | ~1KB | ~12KB (RTK + React-Redux) | ~2KB |
| Boilerplate | Minimal (just a hook) | Moderate (slices, store config) | Minimal (atoms) |
| Learning curve | Easiest | Moderate (RTK simplifies Redux) | Moderate (atomic model) |
| TypeScript | Excellent (inferred) | Excellent (RTK generates) | Excellent (inferred) |
| DevTools | Redux DevTools (compatible) | Redux DevTools (native) | Jotai DevTools |
| Middleware | Built-in (persist, immer, devtools) | Extensive (thunks, sagas, listeners) | Via utilities (atomWithStorage, etc.) |
Zustand โ Minimal, Pragmatic, Fast
Zustand feels like using useState but shared across components. No providers, no actions, no reducers โ just a store created with a hook. It's the most lightweight option and has been winning the React state management conversation.
import { create } from "zustand";
const useStore = create((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
}));
// Use in any component:
const count = useStore((state) => state.count);
Best for: Most React apps, solo developers, teams that want minimal boilerplate, apps of any size.
Weak spot: Less structured than Redux (can become messy in very large teams without conventions). Fewer built-in async patterns than RTK Query.
Redux Toolkit โ The Enterprise Standard
Redux Toolkit (RTK) reinvented Redux โ slices replace switch statements, createAsyncThunk for async, and RTK Query for data fetching. It's the most structured option, which is either a pro (large teams) or a con (more code to write).
Best for: Large teams needing structure, projects using RTK Query for data fetching, codebases that already use Redux, developers who want explicit data flow.
Weak spot: More boilerplate than Zustand or Jotai (even with RTK). Bundle is larger. Overkill for simple apps.
Jotai โ Atomic, Composable, Bottom-Up
Jotai takes an atomic approach: state is split into atoms, and components subscribe to specific atoms. Derived atoms (computed values) are first-class. It's ideal for apps with complex, interdependent state that doesn't fit a single store model.
Best for: Apps with complex derived state, performance-sensitive UIs (only re-renders components that use the changed atom), bottom-up state design.
Weak spot: Atomic model takes getting used to. Can lead to too many atoms without conventions. Smaller ecosystem than Redux.
Decision Matrix
| Scenario | Best Choice |
|---|---|
| New project, best DX, least boilerplate | Zustand |
| Large team, need explicit structure | Redux Toolkit |
| Complex derived state, many interdependencies | Jotai |
| Data fetching + state together | RTK Query or TanStack Query |
| Small to medium app, fast setup | Zustand |
Bottom line: Zustand is the default choice for most React apps in 2026 โ minimal, fast, and TypeScript-first. Redux Toolkit for large teams that want explicit architecture. Jotai for apps where atomic state composition clicks. See also: Frontend Framework Comparison and Testing Strategies.