New to Claude Skills? Learn how to install them →

Rwshobson on GitHub

React State Management

Free

Master state management in modern React applications.

Get this skill

Free · Opens the source repo

What React State Management does

React State Management is a comprehensive guide designed for developers looking to navigate the complexities of state management in React applications. It covers a range of state management solutions including Redux Toolkit, Zustand, Jotai, and React Query, providing clear guidance on when and how to use each. This skill is particularly useful for those setting up global state, managing server state, or transitioning from legacy patterns to modern approaches.

The skill outlines various state categories such as local state, global state, server state, URL state, and form state. Each category is paired with recommended solutions, allowing developers to make informed decisions based on the specific needs of their applications. With practical examples and best practices, users can learn how to implement effective state management strategies that enhance performance and maintainability.

In addition to setup and implementation, the skill addresses common pitfalls and offers migration guides for those moving from legacy Redux to the more streamlined Redux Toolkit. By following the provided best practices, developers can avoid common mistakes and ensure their state management is efficient and scalable. Whether you are building a small application or a large-scale project, this skill equips you with the knowledge to manage state effectively in your React applications.

When to use it

Use this skill when setting up state management for new React applications or when migrating from older patterns.

When not to use it

This skill may not be ideal for very simple applications that do not require complex state management.

What you can build with it

Setting Up Global State

When starting a new React application, use this skill to choose the appropriate state management solution for global state.

Migrating from Legacy Redux

If you're transitioning from legacy Redux, follow the migration guides to adopt Redux Toolkit effectively.

Managing Server State

Utilize this skill to implement server state management with React Query for applications with heavy data interactions.

How to install React State Management

View source

1. Install with the skills CLI

npx skills add wshobson/agents/react-state-management --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by wshobson

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

TypeDescriptionSolutions
Local StateComponent-specific, UI stateuseState, useReducer
Global StateShared across componentsRedux Toolkit, Zustand, Jotai
Server StateRemote data, cachingReact Query, SWR, RTK Query
URL StateRoute parameters, searchReact Router, nuqs
Form StateInput values, validationReact 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)

// 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<AppState>()(
  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 (
    <header className={theme}>
      {user?.name}
      <button onClick={toggleTheme}>Toggle Theme</button>
    </header>
  )
}

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

// 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<string>) => {
      // Immer allows "mutations"
      state.push({ text: action.payload, completed: false });
    },
  },
});

Frequently asked questions about React State Management

Similar skills