Why I Picked Pinia Over Redux (And When Redux Wins)

· Insights

Pinia's simpler API vs Redux Toolkit's ecosystem — real comparison with code and an honest take on when each state library wins.

Last updated: July 13, 2026 \u00b7 4-minute read

I have used Redux on production React projects for three years and Pinia on Vue projects for the last 18 months. Both solve the same problem \u2014 managing state that multiple components need to access \u2014 but the developer experience difference is substantial. This is not a \u201cPinia is better\u201d post. It is an honest breakdown of where each one wins.

The Code Comparison

Here is a simple counter store in both. Redux Toolkit first:

const fetchUser = createAsyncThunk(\u2018user/fetch\u2019, async (id: string) = { const res = await fetch(/api/users/\/assets/blog/id); return res.json(); });

const userSlice = createSlice({ name: \u2018user\u2019, initialState: { data: null, loading: false, error: null }, reducers: {}, extraReducers: (builder) = { builder .addCase(fetchUser.pending, (state) = { state.loading = true; }) .addCase(fetchUser.fulfilled, (state, action) = { state.data = action.payload; state.loading = false; }) .addCase(fetchUser.rejected, (state, action) = { state.error = action.error.message; state.loading = false; }); }, });

Now the same in Pinia:

export const useUserStore = defineStore(\u2018user\u2019, () = { const data = ref(null); const loading = ref(false); const error = ref(null);

async function fetchUser(id: string) { loading.value = true; try { data.value = await fetch(/api/users/\/assets/blog/id).then(r = r.json()); } catch (e) { error.value = e.message; } finally { loading.value = false; } }

return { data, loading, error, fetchUser }; });

The Pinia version is 30% less code. No thunks, no extraReducers, no action creators. The setup store syntax with defineStore and a composition function reads like regular TypeScript. Someone on r/vuejs called it \u201cwhat Redux should have been from the start\u201d \u2014 hyperbolic, but I understand the sentiment.

Where Pinia Wins

Pinia is composable. You can use any Vue composable inside a Pinia store, which means you can call other stores, use computed properties, and leverage Vue\u2019s reactivity system directly. The TypeScript support is also better out of the box \u2014 no need for type generics on hooks like you need with Redux\u2019s useSelector.

For Vue projects, Pinia is the obvious choice. It is the official state management solution recommended by the Vue core team. The DX is better, the API surface is smaller, and the learning curve is gentler.

Where Redux Still Matters

Redux is not going anywhere, and there are three scenarios where I still reach for it:

Large teams with established patterns. If your team of 15+ developers already has Redux conventions, middleware, and a shared library of thunks, switching to Pinia (or Zustand, or Jotai) is a costly migration with no functional benefit.

Complex async workflows. Redux Saga and Redux Observable give you fine-grained control over side effects that Pinia does not match. If you have cascading API calls with retry logic, cancellation, and event-sourced patterns, Redux\u2019s middleware ecosystem is more mature.

Time-travel debugging. Redux DevTools gives you action-by-action replay with state snapshots. Pinia has a Vue DevTools integration, but it is not as granular. For debugging complex state transitions in a data-heavy application, this matters.

A Reddit thread on r/reactjs from last month had a good discussion about this \u2014 most commenters agreed that Redux is overkill for small-to-medium apps but hard to replace in large codebases with complex data flows.

The Practical Take

If you are starting a new Vue project, use Pinia. If you are starting a new React project and it is small-to-medium, use Zustand or Jotai instead of Redux. If you are on a large React team with existing Redux infrastructure, stay with Redux Toolkit \u2014 the migration cost is not worth it.

Check out the projects to see which state management I chose for each one, or visit the blog for more technical comparisons. The lab has some experiments with different state management patterns.

---

Not affiliated with the Vue or Redux teams. Code tested with Pinia 2.x and Redux Toolkit 2.x.