# React State Management > Master modern React state management with Redux Toolkit, Zustand, Jotai, and React Query. Use when setting up global state, managing server state, or choosing between state management solutions. Source: https://skillsagentes.com/skills/wshobson/agents/react-state-management Repository: https://github.com/wshobson/agents Author: wshobson License: MIT Updated: hace 2 meses Context cost: 49 tok installed, 1k tok once triggered, 2.9k tok with every bundled file Bundle: 2 files, 11 KB Permissions requested: none declared ## Install ```bash npx -y skills add wshobson/agents --skill react-state-management --agent claude-code ``` ## What it does - Guía patrones de estado en React: local, global, de servidor, de URL y de formularios - Ayuda a elegir entre Redux Toolkit, Zustand, Jotai, React Query o SWR según el caso - Provee ejemplos de configuración con Zustand (create, devtools, persist) - Ofrece buenas prácticas (colocar estado cerca, usar selectores, normalizar datos) - Incluye guía de migración de Redux clásico a Redux Toolkit ## Use it when - Configurar estado global en una app React - Elegir entre Redux Toolkit, Zustand o Jotai - Gestionar estado de servidor con React Query o SWR - Migrar de Redux clásico a patrones modernos ## What triggers it - "¿Debería usar Zustand o Redux Toolkit para esta app?" - "Ayúdame a migrar mi reducer de Redux clásico a Redux Toolkit" - "Configura un store global con Zustand y persistencia" - "¿Cómo separo el estado del servidor del estado del cliente?" ## Files - SKILL.md — 4 KB - references/details.md — 8 KB ## SKILL.md Reproduced verbatim from wshobson/agents under MIT. This section is the upstream document and is in English. # React State Management Comprehensive guide to modern React state management patterns, from local component state to global stores and server state synchronization. ## When to Use This Skill - Setting up global state management in a React app - Choosing between Redux Toolkit, Zustand, or Jotai - Managing server state with React Query or SWR - Implementing optimistic updates - Debugging state-related issues - Migrating from legacy Redux to modern patterns ## Core Concepts ### 1. State Categories | Type | Description | Solutions | | ---------------- | ---------------------------- | ----------------------------- | | **Local State** | Component-specific, UI state | useState, useReducer | | **Global State** | Shared across components | Redux Toolkit, Zustand, Jotai | | **Server State** | Remote data, caching | React Query, SWR, RTK Query | | **URL State** | Route parameters, search | React Router, nuqs | | **Form State** | Input values, validation | React Hook Form, Formik | ### 2. Selection Criteria ``` Small app, simple state → Zustand or Jotai Large app, complex state → Redux Toolkit Heavy server interaction → React Query + light client state Atomic/granular updates → Jotai ``` ## Quick Start ### Zustand (Simplest) ```typescript // store/useStore.ts import { create } from 'zustand' import { devtools, persist } from 'zustand/middleware' interface AppState { user: User | null theme: 'light' | 'dark' setUser: (user: User | null) => void toggleTheme: () => void } export const useStore = create()( devtools( persist( (set) => ({ user: null, theme: 'light', setUser: (user) => set({ user }), toggleTheme: () => set((state) => ({ theme: state.theme === 'light' ? 'dark' : 'light' })), }), { name: 'app-storage' } ) ) ) // Usage in component function Header() { const { user, theme, toggleTheme } = useStore() return (
{user?.name}
) } ``` ## Detailed patterns and worked examples Detailed pattern documentation lives in `references/details.md`. Read that file when the navigation tier above is insufficient. ## Best Practices ### Do's - **Colocate state** - Keep state as close to where it's used as possible - **Use selectors** - Prevent unnecessary re-renders with selective subscriptions - **Normalize data** - Flatten nested structures for easier updates - **Type everything** - Full TypeScript coverage prevents runtime errors - **Separate concerns** - Server state (React Query) vs client state (Zustand) ### Don'ts - **Don't over-globalize** - Not everything needs to be in global state - **Don't duplicate server state** - Let React Query manage it - **Don't mutate directly** - Always use immutable updates - **Don't store derived data** - Compute it instead - **Don't mix paradigms** - Pick one primary solution per category ## Migration Guides ### From Legacy Redux to RTK ```typescript // Before (legacy Redux) const ADD_TODO = "ADD_TODO"; const addTodo = (text) => ({ type: ADD_TODO, payload: text }); function todosReducer(state = [], action) { switch (action.type) { case ADD_TODO: return [...state, { text: action.payload, completed: false }]; default: return state; } } // After (Redux Toolkit) const todosSlice = createSlice({ name: "todos", initialState: [], reducers: { addTodo: (state, action: PayloadAction) => { // Immer allows "mutations" state.push({ text: action.payload, completed: false }); }, }, }); ``` --- Skills Agentes — https://skillsagentes.com/skills/wshobson/agents/react-state-management