Pinia Best Practices and Common Mistakes
How to keep Pinia stores maintainable in medium-to-large Vue applications.
1. Interview focus
- Store design boundaries
- Reactivity pitfalls
- Team-level maintainability practices
2. Store design principles
Single responsibility per store
useAuthStore();
useUserStore();
useCatalogStore();
Avoid one mega store that mixes unrelated concerns.
Keep stores as state containers
Prefer:
- state
- deterministic getters
- focused actions
Move heavy business workflows to composables/services.
Keep side effects outside when possible
Instead of placing all API orchestration directly in store actions, use composables for workflow and keep store actions focused on state updates.
3. Common mistakes
Mistake 1: direct destructuring of state/getters
// bad: reactivity can be lost
const { token, isLoggedIn } = authStore;
// good
const { token, isLoggedIn } = storeToRefs(authStore);
Mistake 2: accessing stores outside valid context
Call stores in setup, composables, or app lifecycle-safe locations.
Mistake 3: circular store dependencies
Store A imports Store B and Store B imports Store A causes fragile runtime behavior.
Mistake 4: mutating non-reactive copies
Always update through reactive references or actions.
4. Practical standards
- Use TypeScript types for state and payloads
- Keep action names explicit (
setUserProfile,resetSession) - Group stores by business domain
- Add reset methods for logout/account switch
- Keep persistence policy explicit per field
5. Interview-ready summary
I keep stores small and domain-focused, avoid reactivity pitfalls with
storeToRefs, move complex orchestration to composables, and enforce clear typing and reset strategies.