Redux
A predictable state container: one store, actions describe changes, pure reducers apply them.
Core Redux is small but verbose by hand. Its strengths are a single source of truth, middleware and time-travel debugging.
State & data fetching
Redux is the pattern and core library, Redux Toolkit is the official way to write Redux today, and Zustand is a separate, much smaller store with almost no ceremony.
A predictable state container: one store, actions describe changes, pure reducers apply them.
Core Redux is small but verbose by hand. Its strengths are a single source of truth, middleware and time-travel debugging.
The official, recommended toolset for writing Redux logic.
configureStore, createSlice with Immer, createAsyncThunk and RTK Query remove most boilerplate while keeping Redux's model and DevTools.
A small, hook-based state library built on a simple store and selectors.
You create a store with a function, read slices with a hook, and update with set(). No providers, actions or reducers are required.
| Aspect | Redux | Redux Toolkit | Zustand |
|---|---|---|---|
| Boilerplate | High | Low | Very low |
| Provider needed | Yes | Yes | No |
| Immutability | Manual | Immer built in | Manual or immer middleware |
| Server data | Add middleware | RTK Query included | Pair with TanStack Query |
| Best for | Learning the model, legacy apps | Large apps and teams | Small to mid apps, simple global state |
Redux centralises state in one store updated only by dispatching actions to pure reducers, which makes every change explicit and traceable. Zustand is a small store you create with a function; components read slices with a hook and update with set(), with no actions, reducers or provider.
Redux Toolkit is the official way to write Redux. configureStore sets up the store with good defaults and DevTools, createSlice generates action creators and reducers together, Immer lets you write 'mutating' logic safely, and RTK Query handles data fetching. The underlying Redux model is the same.
No. It is a package from the Redux team that wraps Redux core with utilities. Store, actions, reducers, middleware and DevTools all work the same; Toolkit removes the boilerplate and common mistakes, such as accidental mutation.
No. A Zustand store is a hook created outside React, so any component can import and use it directly. Redux needs a <Provider store={store}> at the top of the tree so components can access the store through react-redux hooks.
In Redux and Redux Toolkit, useSelector subscribes to a selected value and re-renders only when it changes by reference. In Zustand, you pass a selector to the store hook (useStore(state => state.count)) and the component re-renders only when that slice changes; useShallow helps when selecting objects.
Redux Toolkit: a single, predictable update model, strong DevTools with action history, standard patterns that large teams share, middleware for cross-cutting concerns, and RTK Query for server data. Zustand can scale too, but its flexibility needs more team conventions.
Plain Redux: a reducer returns a new state object with spread copies. Redux Toolkit: createSlice reducers can 'mutate' a draft because Immer produces the immutable copy. Zustand: call set(state => ({ count: state.count + 1 })) or set a partial object; Zustand merges it shallowly.
Plain Redux needs action types, action creators, a reducer, a store and a Provider. Redux Toolkit needs one createSlice, configureStore and a Provider. Zustand needs one create() call returning the state and an increment function, used directly as a hook.
Plain Redux uses middleware such as redux-thunk or redux-saga. Redux Toolkit includes thunks and provides createAsyncThunk for pending, fulfilled and rejected states, plus RTK Query for fetching. Zustand actions can simply be async functions that call set() when data arrives.
RTK Query is Redux Toolkit's data fetching and caching layer that generates hooks from endpoint definitions and caches results in the store with tag-based invalidation. Zustand has no built-in equivalent; it is usually paired with TanStack Query for server state.
Practise every comparison in your dashboard.
Start learning