Overview
Use Zustand for new React apps that need client state beyond useState; use Redux Toolkit (RTK) when the codebase already runs Redux, when RTK Query is the data layer, or when a large team needs enforced action and reducer structure. As of 2026-10-01 Zustand is at 5.0 and RTK at 2.13 (Redux core 5). Keep server data in TanStack Query or RTK Query, not in either client store.
Comparison
| Dimension | Zustand 5 | Redux Toolkit 2 |
|---|---|---|
| API | One create call; plain functions as actions | Slices, reducers, actions, store, Provider |
| Size (gzipped, whole package) | Under 1 KB | About 14 KB, plus about 4 KB for React-Redux |
| Provider | Not required (per-request store for SSR) | Required for React-Redux |
| Async | Plain async functions in actions | createAsyncThunk, listener middleware, RTK Query |
| Server-state caching | External (TanStack Query, SWR) | RTK Query bundled |
| Debugging | Redux DevTools via devtools middleware | Redux DevTools with action log and time travel |
| Structure | Convention-free | Enforced through actions and reducers |
Pick Zustand when
Pick Zustand for client state in new apps.
- Auth, UI flags, carts, and wizards fit one store with colocated actions.
- No provider tree, and selectors subscribe components to slices.
- Pair it with TanStack Query for server state (tanstack-query-vs-swr).
- In Zustand 5, a selector that returns a new object or array re-renders in a loop; wrap it in
useShallow. Details on zustand-vs-jotai. - In Next.js, create the store per request so state is not shared across users.
Pick Redux Toolkit when
Pick RTK when its structure or data layer is the reason.
- An existing Redux codebase: write new slices with
createSlice, and migrate old hand-written reducers when you touch them. - RTK Query is already the data layer (caching, invalidation, generated endpoints from OpenAPI).
- A large team benefits from named actions, an auditable event log, and time-travel debugging in Redux DevTools.
- Redux middleware (listener middleware, sagas) already carries business logic.
Migrate
Move slice by slice and let both stores coexist.
- Redux slice to Zustand store: selectors map one to one; dispatches become store methods.
- Thunks become async functions in the store. Sagas have no direct mapping; budget extra time.
- RTK Query to TanStack Query: swap endpoint by endpoint.
- Leave stable Redux areas alone; build new features in Zustand.
See react-state-management for where state should live before choosing a library.
FAQ
Should I use Zustand or Redux for a new React app?
Use Zustand 5 for most new apps that need client state beyond useState. Use Redux Toolkit 2 when the codebase already runs Redux, RTK Query is the data layer, or a large team needs enforced action and reducer structure.
Is Redux still worth learning?
Redux Toolkit remains the choice for existing Redux codebases and teams that want named actions, an auditable event log, and time-travel debugging. For new client state, Zustand is under 1 KB gzipped against about 14 KB for RTK plus about 4 KB for React-Redux.
Can Zustand and Redux run in the same app?
Yes; move slice by slice and let both stores coexist. Leave stable Redux areas alone and build new features in Zustand.
Should server data go in Zustand or Redux?
Neither; keep server data in TanStack Query or RTK Query. Use the client store only for client state such as UI flags and carts.