Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
giuseppe-trisciuoglio avatar

React Patterns

  • 2.6k installs
  • 311 repo stars
  • Updated June 22, 2026
  • giuseppe-trisciuoglio/developer-kit

react-patterns is a React 19 skill for Server Components, Server Actions, optimistic UI, and concurrent hooks.

About

react-patterns provides React 19 guidance for Next.js App Router applications covering Server Components, Server Actions, and concurrent hooks. A quick reference maps useState, useReducer, useTransition, useDeferredValue, useOptimistic, useActionState, useFormStatus, and React Compiler auto-memoization to concrete use cases. Examples show async Server Components fetching data with client islands using useTransition, useOptimistic todo lists for instant feedback, and Server Actions validated with Zod plus useActionState form status. Instructions walk through choosing server versus client components, typing props, wrapping async trees in Suspense, optimizing with React Compiler or manual memoization, and validating public Server Action endpoints. Best practices emphasize starting server-first, adding use client only for hooks and events, keeping effects for external synchronization, and using stable list keys. React 19 specifics require Suspense around use(promise), serializable server-to-client props, and schema validation on every Server Action submission.

  • Server Component and client island split with useTransition.
  • useOptimistic and useActionState form mutation patterns.
  • Zod-validated Server Actions with revalidatePath.
  • React 19 hook quick reference including use() and useFormStatus.
  • Security note treating Server Actions as public endpoints.

React Patterns by the numbers

  • 2,593 all-time installs (skills.sh)
  • +64 installs in the week ending Jul 28, 2026 (Skillselion tracking)
  • Ranked #190 of 2,277 Frontend Development skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
At a glance

react-patterns capabilities & compatibility

Capabilities
server and client component decision guidance · optimistic ui with useoptimistic and usetransiti · server action forms with zod and useactionstate · suspense and use() async render patterns · performance guidance for react compiler versus m
Works with
vercel
Use cases
frontend · ui design · testing
IDEs
vscode · cursor ide · webstorm
Pricing
Free
From the docs

What react-patterns says it does

Start with Server Component (no directive needed)
SKILL.md
addOptimisticTodo(newTodo); await addTodo(newTodo);
SKILL.md
npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill react-patterns

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs2.6k
repo stars311
Security audit3 / 3 scanners passed
Last updatedJune 22, 2026
Repositorygiuseppe-trisciuoglio/developer-kit

How do I implement React 19 App Router patterns with optimistic UI and validated Server Actions?

Implement React 19 and Next.js App Router patterns for Server Components, Server Actions, optimistic UI, and concurrent rendering.

Who is it for?

Frontend developers building Next.js App Router apps with React 19 concurrent features.

Skip if: Skip for class-component-only codebases or backend API design without React UI.

When should I use this skill?

User builds React 19 apps, Server Actions, useOptimistic, useActionState, or App Router migration.

What you get

Typed server and client components with validated actions, Suspense boundaries, and optimistic updates.

  • Typed prop interfaces
  • Composition examples
  • State-lifting guidance

By the numbers

  • ButtonProps example defines 5 typed fields including variant and size unions

Files

SKILL.mdMarkdownGitHub ↗

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

PatternHook / APIUse Case
Local stateuseStateSimple component state
Complex stateuseReducerMulti-action state machines
Side effectsuseEffectSubscriptions, data fetching
Shared stateuseContext / createContextCross-component data
DOM accessuseRefFocus, measurements, timers
PerformanceuseMemo / useCallbackExpensive computations
Non-urgent updatesuseTransitionSearch/filter on large lists
Defer expensive UIuseDeferredValueStale-while-updating
Read resourcesuse() (React 19)Promises and context in render
Optimistic UIuseOptimistic (React 19)Instant feedback on mutations
Form statususeFormStatus (React 19)Pending state in child components
Form stateuseActionState (React 19)Server action results
Auto-memoizationReact CompilerEliminates 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

// 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

'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

// 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

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

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

Related skills

Forks & variants (1)

React Patterns has 1 known copy in the catalog totaling 31 installs. They canonicalize to this original listing.

How it compares

Pick react-patterns over generic frontend skills when you need concrete React composition and prop-typing recipes rather than framework-agnostic UI advice.

FAQ

When add the use client directive?

Only when you need hooks, browser APIs, or event handlers in that file.

Must Server Action inputs be validated?

Yes. Server Actions are public endpoints and need schema validation on every submission.

Should I manually memoize with React Compiler?

With React Compiler enabled, avoid manual useMemo, useCallback, and memo in most cases.

Is React Patterns safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.