Skip to main content
skill CX Codex

react-patterns · giuseppe-trisciuoglio — Claude Code skill for React 19 patterns

Teaches your agent React 19 and Next.js App Router patterns: Server Components, Server Actions, useOptimistic, Suspense boundaries. Useful when the app is already on React 19.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add giuseppe-trisciuoglio/developer-kit --skill react-patterns -a claude-code
Open on GitHub

What react-patterns does

The skill covers how to split a page into Server and Client Components, how to wrap async work in Suspense, and how to wire a form to a Server Action. A quick-reference table maps each job to a hook: useState for simple state, useReducer for multi-action machines, useTransition for non-urgent updates, useOptimistic for instant feedback on a mutation, useActionState for server action results. Copy-paste examples come with it — an optimistic todo list, a post form validated with Zod and revalidatePath, a custom useOnlineStatus hook.

The agent gets a fixed order of steps: pick the component type, choose hooks, type the props, wrap data fetching in Suspense, add an ErrorBoundary, then test Server Actions with both invalid and valid input. Its tool list is limited to reading and editing files plus Bash, Grep and Glob, so it stays inside your project.

For public endpoints the skill tells you to validate with a schema. Worth doing before the form ships: client-side checks prove nothing once someone posts to the action directly. Performance work is either React Compiler or manual useMemo and useCallback.

What it helps with

  • split a page into Server and Client Components
  • add an optimistic insert without a page reload
  • connect a form to a Server Action and surface field errors
  • wrap data fetching in Suspense and handle the failure
  • move a class component onto hooks

Example prompts for the agent

  • Write a Server Component for the product page and a client Add to Cart button
  • Build a post form with useActionState and Zod validation
  • Add optimistic updates to the todo list with useOptimistic

How to install react-patterns

1Skills CLI (Vercel)

npx skills add giuseppe-trisciuoglio/developer-kit --skill react-patterns -a claude-code

2Manually: put the files in place

~/.claude/skills/react-patterns/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/react-patterns/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about react-patterns

How do I install react-patterns in Claude?

Run npx skills add giuseppe-trisciuoglio/developer-kit --skill react-patterns -a claude-code. The skill lands at ~/.claude/skills/react-patterns/SKILL.md.

What does react-patterns do?

It hands the agent React 19 and Next.js App Router patterns: Server Components, Server Actions, useOptimistic, useActionState, useTransition, Suspense boundaries and TypeScript typing, with code examples you can reuse.

Which platforms can run this skill?

Claude, Codex, Cursor, GitHub Copilot, Gemini CLI and OpenCode. Each has its own install command and its own skills directory.

Source text

SKILL.md · MIT
---
name: react-patterns
description: Provides comprehensive React 19 patterns for Server Components, Server Actions, useOptimistic, useActionState, useTransition, concurrent features, Suspense boundaries, and TypeScript integration. Generates executable code patterns, validates security for public endpoints, and optimizes performance with React Compiler or manual memoization. Proactively use when building React 19 applications with Next.js App Router, implementing optimistic UI, or optimizing concurrent rendering.
allowed-tools: Read, Write, Edit, Bash, Grep, Glob
---

# React 19 Development Patterns

## Overview

React 19 patterns for Next.js App Router, Server Actions, optimistic UI, and concurrent features. See Quick Reference for API summary and Examples for copy-paste patterns.

## When to Use

- Building React 19 applications with Next.js App Router
- Implementing optimistic UI with `useOptimistic` or `useTransition`
- Creating Server Actions with form validation
- Migrating from class components to hooks
- Optimizing concurrent rendering with React Compiler
- Managing complex state with `useReducer` or custom hooks
- Wrapping async operations in Suspense boundaries

## Quick Reference

| Pattern | Hook / API | Use Case |
|---------|-----------|----------|
| Local state | `useState` | Simple component state |
| Complex state | `useReducer` | Multi-action state machines |
| Side effects | `useEffect` | Subscriptions, data fetching |
| Shared state | `useContext` / `createContext` | Cross-component data |
| DOM access | `useRef` | Focus, measurements, timers |
| Performance | `useMemo` / `useCallback` | Expensive computations |
| Non-urgent updates | `useTransition` | Search/filter on large lists |
| Defer expensive UI | `useDeferredValue` | Stale-while-updating |
| Read resources | `use()` (React 19) | Promises and context in render |
| Optimistic UI | `useOptimistic` (React 19) | Instant feedback on mutations |
| Form status | `useFormStatus` (React 19) | Pending state in child components |
| Form state | `useActionState` (React 19) | Server action results |
| Auto-memoization | React Compiler | Eliminates manual memo/callback |

## Instructions

1. **Identify Component Type**: Determine if Server Component or Client Component is needed
2. **Select Hooks**: Use appropriate hooks for state management and side effects
3. **Type Props**: Define TypeScript interfaces for all component props
4. **Handle Async**: Wrap data-fetching components in Suspense boundaries
5. **Optimize**: Use React Compiler or manual memoization for expensive renders
6. **Handle Errors**: Add ErrorBoundary for graceful error handling
7. **Validate Server Actions**: Define Zod/schema validation, then test:
   - Submit invalid inputs → verify rejection
   - Submit valid inputs → verify success

## Examples

### Server Component with Client Interaction

```tsx
// Server Component (default) — async, fetches data
async function ProductPage({ id }: { id: string }) {
  const product = await db.product.findUnique({ where: { id } });

  return (
    <div>
      <h1>{product.name}</h1>
      <AddToCartButton productId={product.id} />
    </div>
  );
}

// Client Component — handles interactivity
'use client';
function AddToCartButton({ productId }: { productId: string }) {
  const [isPending, startTransition] = useTransition();

  const handleAdd = () => {
    startTransition(async () => {
      await addToCart(productId);
    });
  };

  return (
    <button onClick={handleAdd} disabled={isPending}>
      {isPending ? 'Adding...' : 'Add to Cart'}
    </button>
  );
}
```

### useOptimistic for Instant Feedback

```tsx
'use client';
import { useOptimistic } from 'react';

function TodoList({ todos, addTodo }: { todos: Todo[]; addTodo: (t: Todo) => Promise<void> }) {
  const [optimisticTodos, addOptimisticTodo] = useOptimistic(
    todos,
    (state, newTodo: Todo) => [...state, { ...newTodo, pending: true }]
  );

  const handleSubmit = async (formData: FormData) => {
    const newTodo = { id: Date.now(), text: formData.get('text') as string };
    addOptimisticTodo(newTodo);  // Immediate UI update
    await addTodo(newTodo);      // Actual backend call
  };

  return (
    <form action={handleSubmit}>
      {optimisticTodos.map(todo => (
        <div key={todo.id} style={{ opacity: todo.pending ? 0.5 : 1 }}>
          {todo.text}
        </div>
      ))}
      <input type="text" name="text" />
      <button type="submit">Add</button>
    </form>
  );
}
```

### Server Action with Form

```tsx
// app/actions.ts
'use server';
import { z } from 'zod';
import { revalidatePath } from 'next/cache';

const schema = z.object({
  title: z.string().min(5),
  content: z.string().min(10),
});

export async function createPost(prevState: any, formData: FormData) {
  const parsed = schema.safeParse({
    title: formData.get('title'),
    content: formData.get('content'),
  });

  if (!parsed.success) {
    return { errors: parsed.error.flatten().fieldErrors };
  }

  await db.post.create({ data: parsed.data });
  revalidatePath('/posts');
  return { success: true };
}

// app/blog/new/page.tsx
'use client';
import { useActionState } from 'react';
import { createPost } from '../actions';

export default function NewPostPage() {
  const [state, formAction, pending] = useActionState(createPost, {});

  return (
    <form action={formAction}>
      <input name="title" placeholder="Title" />
      {state.errors?.title && <span>{state.errors.title[0]}</span>}
      <textarea name="content" placeholder="Content" />
      <button type="submit" disabled={pending}>
        {pending ? 'Publishing...' : 'Publish'}
      </button>
    </form>
  );
}
```

### Custom Hook

```tsx
export function useOnlineStatus() {
  const [isOnline, setIsOnline] = useState(true);

  useEffect(() => {
    function handleOnline() { setIsOnline(true); }
    function handleOffline() { setIsOnline(false); }

    window.addEventListener('online', handleOnline);
    window.addEventListener('offline', handleOffline);

    return () => {
      window.removeEventListener('online', handleOnline);
      window.removeEventListener('offline', handleOffline);
    };
  }, []);

  return isOnline;
}
```

### useTransition for Non-Urgent Updates

```tsx
function SearchableList({ items }: { items: Item[] }) {
  const [query, setQuery] = useState('');
  const [isPending, startTransition] = useTransition();
  const [filteredItems, setFilteredItems] = useState(items);

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setQuery(e.target.value);
    startTransition(() => {
      setFilteredItems(items.filter(i => i.name.toLowerCase().includes(e.target.value.toLowerCase())));
    });
  };

  return (
    <div>
      <input value={query} onChange={handleChange} />
      {isPending && <span>Filtering...</span>}
      <ul>{filteredItems.map(i => <li key={i.id}>{i.name}</li>)}</ul>
    </div>
  );
}
```

## Best Practices

### Server vs Client Decision

- Start with Server Component (no directive needed)
- Add `'use client'` only for: hooks, browser APIs, event handlers

### State Management

- Keep state minimal — compute derived values during render, not in effects
- Use `useReducer` for state with multiple related actions
- Lift state up to the nearest common ancestor

### Effects

- Use effects only for external system synchronization
- Always specify correct dependency arrays
- Return cleanup functions for subscriptions and timers
- Never mutate state directly — always create new references

### Performance

- With React Compiler: avoid manual `useMemo`, `useCallback`, `memo`
- Without React Compiler: use `useMemo` for expensive computations, `useCallback` for stable callbacks
- Use `useTransition` for low-priority state updates
- Use stable IDs as list keys, not array indices

### React 19 Specifics

- Wrap `use(promise)` components in Suspense boundaries
- Use `useActionState` for form-server action integration
- Validate Server Action inputs — they are public endpoints
- Pass serializable data from Server to Client Components

## Constraints and Warnings

- **Server Components**: Cannot use hooks, event handlers, or browser APIs
- **use() Hook**: Can only be called during render, not in callbacks or effects
- **Server Actions**: Must include `'use server'` directive; always validate inputs
- **State Mutations**: Never mutate state directly — always create new references
- **Effect Dependencies**: Include all dependencies in `useEffect` dependency arrays
- **Memory Leaks**: Always clean up subscriptions and event listeners in useEffect return

## References

Consult these files for detailed patterns:

- **[references/hooks-patterns.md](references/hooks-patterns.md)** — useState, useEffect, useRef, useReducer, custom hooks, common pitfalls
- **[references/component-patterns.md](references/component-patterns.md)** — Props, composition, lifting state, context, compound components, error boundaries
- **[references/react19-features.md](references/react19-features.md)** — use(), useOptimistic, useFormStatus, useActionState, Server Actions, Server Components, migration guide
- **[references/performance-patterns.md](references/performance-patterns.md)** — React Compiler setup, useMemo, useCallback, useTransition, useDeferredValue, lazy loading
- **[references/typescript-patterns.md](references/typescript-patterns.md)** — Typed props, generic components, event handlers, discriminated unions, context typing
- **[references/learn.md](references/learn.md)** — Progressive learning guide from basics to advanced React 19
- **[references/reference.md](references/reference.md)** — Complete API reference for all React hooks and component APIs

© giuseppe-trisciuoglio · MIT · giuseppe-trisciuoglio/developer-kit

Similar skills

Everything for Frontend and UI →

react-patterns by other authors comes first.

react-patterns affaan-m A skill for Claude and other AI editors that steers the agent toward idiomatic React 18/19: hooks discipline, server/client boundaries, forms, data fetching. CX Codex +1 4,900installs react-patterns jezweb A skill that checks React 19 components for waterfalls, bundle bloat and re-renders, and suggests composition fixes. Useful while writing or reviewing code. CX Codex +1 1,300installs react-patterns manutej A skill that hands your agent ready React recipes: hooks, component composition, state management and fewer wasted re-renders. CX Codex +1 471installs react-expert https://github.com/Jeffallan A skill for React 18+, Next.js App Router, and create-react-app work. It writes components and hooks, debugs rendering, and migrates class components to functions. CX Codex +1 5,500installs react-dev softaworks Provides type-safe React 18 and 19 patterns for TypeScript components, hooks, and Server Actions. CX Codex +1 4,100installs react-19 prowler-cloud Skill for React 19 with React Compiler: no manual memoization, server components first, ref as a prop. CX Codex +1 671installs nextjs-app-router-patterns Seth Hobson This skill covers Next.js App Router patterns for rendering, routing, and data fetching. Use it when starting an App Router project or moving from Pages Router. CX Codex 32,529installs nextjs-architecture-expert davila7 A Claude subagent for Next.js architecture: App Router, Server Components, Pages Router migration and performance work. 4,935installs typescript-react-patterns agent-skills A skill with 33 TypeScript rules for React: props, hooks, events, refs, generics and context. Useful when the agent writes components and fights type errors. CX Codex +1 1,100installs

From the same set96

tailwind-css-patterns A skill that hands your agent ready Tailwind CSS patterns: responsive grids, cards, forms, dark mode. Useful when it styles React, Vue or Svelte components. CX Codex +1 17,700installs drizzle-orm-patterns Guides Drizzle ORM schema design, typed queries, relations, transactions and migrations. Use it while building database code with a supported dialect. CX Codex +1 5,400installs nextjs-performance A Next.js optimization skill: Core Web Vitals, images and fonts, caching, streaming, bundle size. Useful when pages feel slow and you need a starting point. CX Codex +1 4,900installs unit-test-bean-validation Provides patterns for testing Jakarta Bean Validation constraints and custom validators in JUnit 5. Helps verify DTO logic without loading Spring context. CX Codex +1 4,900installs tailwind-design-system Creates and orchestrates a design system using Tailwind CSS v4.1+ and shadcn/ui. It defines oklch design tokens, themes via CSS variables, and wraps UI primitives. CX Codex +1 4,500installs spring-boot-test-patterns A skill that gives your agent ready patterns for Spring Boot tests: Mockito unit tests, @DataJpaTest and @WebMvcTest slices, Testcontainers integration. CX Codex +1 4,300installs react-code-review Reviews React components and hooks before merge: composition, hook dependencies, accessibility, TypeScript types. Findings come sorted by severity. CX Codex +1 4,300installs spring-boot-rest-api-standards Enforces REST API design standards for Spring Boot, covering URL structure, DTO validation, status codes, and global exception handling. CX Codex +1 4,200installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor