Communitygithub.com

react-patterns

React 18/19 Muster inklusive Hooks-Disziplin, Server/Client-Komponentengrenzen, Suspense + Fehlergrenzen, Formularaktionen, Datenabruf, Entscheidungsbäume für das State-Management und barrierefreie Komposition. Verwenden beim Schreiben oder Überprüfen von React-Komponenten.

Was ist react-patterns?

Diese Skill-Datei definiert idiomatische React 18/19 Muster für den Bau robuster, zugänglicher und leistungsfähiger Komponentenbäume. Sie ist für Entwickler konzipiert, die React-Funktionskomponenten, benutzerdefinierte Hooks oder Komponentenbäume schreiben oder überprüfen, JSX/TSX-Dateien prüfen, den State-Shape oder die Komponentenkomposition entwerfen, Klassenkomponenten oder alten `forwardRef`/`useEffect`-lastigen Code migrieren, zwischen lokalem State, gehobenem State, Context und externen Stores wählen, mit Server-/Client-Komponenten arbeiten (Next.js App Router, RSC), Formulare mit React 19 Aktionen oder kontrollierten Eingaben implementieren und Datenabruf mit TanStack Query / SWR / RSC verdrahten. Die Skill behandelt Kernprinzipien wie Render als reine Funktion von Props und State, Seiteneffekte außerhalb des Renders und Komposition über Vererbung. Sie enthält eine Hooks-Disziplin mit Regeln zur Verwendung von `useState`, `useEffect`, `useMemo` und `useCallback`, einen Entscheidungsbaum für die State-Positionierung, Anleitungen zu Server-/Client-Komponenten, Suspense + Fehlergrenzen, Formularen mit React 19 Aktionen und kontrollierten Eingaben, eine Datenabruf-Entscheidungsmatrix, Kompositionsrezepte (Slots, benannte Slots, Verbundkomponenten, Render-Props), Leistungsrichtlinien (`React.memo`, Render-Kaskaden vermeiden, Listen virtualisieren) und barrierefreie Komposition. Die Skill ist Router-unabhängig und verweist auf verwandte Regeln, Skills und Agenten für tiefergehende Themen.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/react-patterns

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

React Patterns

Idiomatische React 18/19 Muster für den Bau robuster, zugänglicher und leistungsfähiger Komponentenbäume.

Wann aktivieren

  • Schreiben oder Ändern von React-Funktionskomponenten, benutzerdefinierten Hooks oder Komponentenbäumen
  • Überprüfen von JSX/TSX-Dateien
  • Entwerfen des State-Shape oder der Komponentenkomposition
  • Migrieren von Klassenkomponenten oder altem forwardRef/useEffect-lastigem Code
  • Wählen zwischen lokalem State, gehobenem State, Context und externen Stores
  • Arbeiten mit Server Components / Client Components (Next.js App Router, RSC)
  • Implementieren von Formularen mit React 19 Aktionen oder kontrollierten Eingaben
  • Verdrahten des Datenabrufs mit TanStack Query / SWR / RSC

Kernprinzipien

1. Render ist eine reine Funktion von Props und State

// Gut: während des Renders ableiten
function Cart({ items }: { items: CartItem[] }) {
  const total = items.reduce((sum, i) => sum + i.price * i.qty, 0);
  return <span>{formatMoney(total)}</span>;
}

// Schlecht: abgeleiteter State separat gespeichert
function Cart({ items }: { items: CartItem[] }) {
  const [total, setTotal] = useState(0);
  useEffect(() => {
    setTotal(items.reduce((sum, i) => sum + i.price * i.qty, 0));
  }, [items]);
  return <span>{formatMoney(total)}</span>;
}

Abgeleiteter State in useEffect fügt einen Renderzyklus hinzu, kann desynchronisieren und verschleiert den Datenfluss.

2. Seiteneffekte außerhalb des Renders

Effekte, Mutationen, Netzwerkaufrufe und Subskriptionen leben in Ereignisbehandlern oder useEffect – niemals im Render-Body.

3. Komposition über Vererbung

React hat kein Vererbungsmodell für Komponenten. Komponiere mit children, Render-Props oder Komponenten-Props.

Hooks-Disziplin

Siehe rules/react/hooks.md für den vollständigen Regelsatz. Highlights:

  • Nur auf oberster Ebene, niemals bedingt
  • Jede Subskription, jeden Timer, jeden Listener aufräumen
  • Funktionaler Updater (setX(prev => prev + 1)) wenn neuer State vom alten abhängt
  • Standardposition: nicht memoizen – useMemo/useCallback nur hinzufügen, wenn ein Profiler oder eine Abhängigkeitskette zeigt, dass es wichtig ist
  • Einen benutzerdefinierten Hook nur extrahieren, wenn die gleiche Hook-Sequenz in 2+ Komponenten vorkommt

Entscheidungsbaum für die State-Positionierung

Wird von einer Komponente verwendet?
  -> useState darin

Wird von der Elternkomponente + einigen Nachkommen verwendet?
  -> zum nächsten gemeinsamen Vorfahren heben

Wird über entfernte Äste verwendet UND selten gelesen (Theme, Auth, Locale)?
  -> React Context

Häufige Updates, die über den gesamten Baum geteilt werden?
  -> externer Store (Zustand, Jotai, Redux Toolkit)

Abgeleitet von einem Server?
  -> Server-State-Bibliothek (TanStack Query, SWR, RSC fetch)

Die meisten Seiten benötigen weder Context noch einen globalen Store. Widerstehe der Abstraktion, bis das duplizierte Heben schmerzhaft wird.

Server / Client Components (RSC)

// Server Component - Standard, async, sendet nie JS für sich selbst
async function ProductPage({ params }: { params: { id: string } }) {
  const product = await db.product.findUnique({ where: { id: params.id } });
  if (!product) notFound();
  return <ProductView product={product} />;
}

// Client Component - mit "use client" aktivieren
"use client";
export function AddToCartButton({ productId }: { productId: string }) {
  const [pending, startTransition] = useTransition();
  return (
    <button
      disabled={pending}
      onClick={() => startTransition(() => addToCart(productId))}
    >
      {pending ? "Adding..." : "Add to cart"}
    </button>
  );
}

Grenzen:

  • Server -> Client: serialisierbare Props oder children übergeben
  • Client -> Server: Server Actions via <form action={...}> oder imperativ aus Ereignisbehandlern aufrufen
  • Niemals eine Server Component aus einer Client Component Datei importieren – stattdessen via children komponieren

Suspense + Fehlergrenzen

<ErrorBoundary fallback={<ErrorView />}>
  <Suspense fallback={<UserSkeleton />}>
    <UserDetail id={id} />
  </Suspense>
</ErrorBoundary>
  • Platzieren Sie Suspense-Grenzen nahe an den Daten, nicht am Routen-Stamm – zeigen Sie Inhalte progressiv an
  • Error Boundary bleibt eine Klassen-API; verwenden Sie react-error-boundary für einen hook-freundlichen Wrapper
  • Eine Grenze fängt Fehler, die während des Renders, des Lebenszyklus und der Konstruktoren ihrer Kinder geworfen werden – NICHT in Ereignisbehandlern oder asynchronem Code

Formulare

React 19 Formularaktionen (bevorzugt für neuen Code)

"use client";
import { useActionState } from "react";

const initial = { error: null as string | null };

async function updateUserAction(_prev: typeof initial, formData: FormData) {
  "use server";
  const parsed = UserSchema.safeParse(Object.fromEntries(formData));
  if (!parsed.success) return { error: "Invalid input" };
  await db.user.update({ where: { id: parsed.data.id }, data: parsed.data });
  return { error: null };
}

export function UserForm() {
  const [state, formAction, pending] = useActionState(updateUserAction, initial);
  return (
    <form action={formAction}>
      <input name="name" required />
      <button type="submit" disabled={pending}>Save</button>
      {state.error && <p role="alert">{state.error}</p>}
    </form>
  );
}

Kontrollierte Eingaben

Verwenden Sie kontrollierte Eingaben, wenn der Wert andere UI steuert, bei jedem Tastendruck formatiert oder Echtzeit-Validierung implementiert.

Komplexe Formulare

Für mehrstufige Formulare, dynamische Feldarrays oder feldübergreifende Validierung: Verwenden Sie eine Bibliothek (React Hook Form, TanStack Form). Eigenes State-Management für Formulare über trivialer Komplexität hinaus ist eine Wartungsfalle.

Datenabruf-Entscheidungsmatrix

BedarfTool
Daten pro Anfrage im Next.js App RouterRSC await fetch()
Client-seitiger Cache + Mutationen + InvalidierungTanStack Query
Leichter Client-Cache + NeuvalidierungSWR
Echtzeit-SubskriptionenServer-Sent Events, WebSockets oder die Subskriptions-API der Bibliothek
Einmaliges Feuer-und-Vergissfetch() in einem Ereignisbehandler

Vermeiden Sie useEffect + fetch für Anwendungsdaten – Wettlaufsituationen, kein Cache, kein Wiederholungsversuch, keine Suspense-Integration.

Kompositionsrezepte

Slot via children

<Layout>
  <Header />
  <Main>{content}</Main>
</Layout>

Benannte Slots

<Page header={<Nav />} sidebar={<Filters />}>
  <Results />
</Page>

Verbundkomponenten (gemeinsamer State via Context)

<Tabs defaultValue="profile">
  <Tabs.List>
    <Tabs.Trigger value="profile">Profile</Tabs.Trigger>
    <Tabs.Trigger value="settings">Settings</Tabs.Trigger>
  </Tabs.List>
  <Tabs.Panel value="profile"><Profile /></Tabs.Panel>
  <Tabs.Panel value="settings"><Settings /></Tabs.Panel>
</Tabs>

Render-Prop / Funktion-als-Kind

Nützlich, wenn die Elternkomponente Parameter an die gerenderte Ausgabe übergeben muss:

<DataLoader id={id}>
  {({ data, isLoading }) => isLoading ? <Spinner /> : <UserCard user={data} />}
</DataLoader>

Moderne Alternative: ein Hook (useData(id)), der dieselbe Form zurückgibt – normalerweise sauberer.

Leistung

Wann React.memo wirklich hilft

Wickeln Sie eine Komponente nur in React.memo, wenn:

  1. Sie häufig neu rendert
  2. Ihre Props zwischen den Renders normalerweise gleich sind
  3. Ihr Render messbar teuer ist

React.memo fügt bei jedem Render eine Gleichheitsprüfung hinzu. Wenn sich die Props bei den meisten Renders unterscheiden, ist die Prüfung reiner Overhead.

Render-Kaskaden vermeiden

  • Heben Sie State eher nach unten als nach oben, wo möglich
  • Teilen Sie Context: einen Context pro Belang, sodass eine Änderung an themeContext nicht Auth-Konsumenten neu rendert
  • Verwenden Sie useSyncExternalStore für externe State-Bibliotheken – erforderlich für sicheres gleichzeitiges Rendern

Listen

  • Geben Sie stabile key-Props (Datenbank-ID, nicht Array-Index)
  • Virtualisieren Sie lange Listen mit @tanstack/react-virtual oder react-window, sobald die sichtbare Elementanzahl ~50 mit nicht-trivialen Zeilen überschreitet

Barrierefreiheit zuerst komponieren

  • Rendern Sie immer semantisches HTML (<button>, <a>, <nav>, <main>), bevor Sie zu role-Attributen greifen
  • Jedes interaktive Element muss per Tastatur erreichbar sein
  • Formulareingaben benötigen Labels – <label htmlFor> oder aria-label, wenn sie visuell durch ein Icon beschriftet sind
  • Verwalten Sie den Fokus bei Routenwechseln und Modal-Öffnen/Schließen
  • Führen Sie axe in Komponententests aus (siehe skills/react-testing)
  • Querverweis: skills/accessibility/SKILL.md behandelt WCAG-Kriterien und Musterbibliotheken

Routing

Diese Skill ist Router-unabhängig. Die obigen Muster funktionieren mit React Router, TanStack Router, Next.js App Router, Remix Router. Router-spezifische Muster (Loader, Actions, verschachtelte Layouts) folgen der Dokumentation des Routers – das sind Framework-Belange, die auf dem React-Kern aufbauen.

Außerhalb des Rahmens (Verweisbereiche)

  • Next.js-Spezifika: App Router Daten laden, Route Handler, Middleware, Parallel Routes – separates Thema, Next.js-Dokumentation verwenden
  • React Native: Plattformspezifische Muster unterscheiden sich genug, um eine separate react-native-patterns-Skill zu rechtfertigen (noch nicht vorhanden)
  • Remix: Loader/Action-Konventionen überschneiden sich mit RSC, folgen aber der Remix-Dokumentation

Verwandt

  • Regeln: rules/react/ – Codestil, Hooks, Muster, Sicherheit, Tests
  • Skills: react-performance für den von Vercel abgeleiteten Leistungsregelsatz, frontend-patterns für frameworkübergreifende UI-Belange, accessibility, angular-developer für Framework-Vergleich
  • Agenten: react-reviewer für Code-Review, react-build-resolver für Build-/Bundler-Fehler
  • Befehle: /react-review, /react-build, /react-test

Beispiele

Benutzerdefinierter Hook für verzögerte Suche

function useDebounce<T>(value: T, delay = 300): T {
  const [debounced, setDebounced] = useState(value);
  useEffect(() => {
    const id = setTimeout(() => setDebounced(value), delay);
    return () => clearTimeout(id);
  }, [value, delay]);
  return debounced;
}

function SearchBox() {
  const [query, setQuery] = useState("");
  const debounced = useDebounce(query, 300);
  const { data } = useQuery({
    queryKey: ["search", debounced],
    queryFn: () => searchApi(debounced),
    enabled: debounced.length > 0,
  });
  return (
    <>
      <input value={query} onChange={(e) => setQuery(e.target.value)} />
      <Results items={data ?? []} />
    </>
  );
}

Optimistische UI mit React 19 useOptimistic

"use client";
import { useOptimistic } from "react";

export function MessageList({ messages }: { messages: Message[] }) {
  const [optimistic, addOptimistic] = useOptimistic(
    messages,
    (state, newMessage: Message) => [...state, newMessage],
  );

  async function send(formData: FormData) {
    const text = String(formData.get("text"));
    addOptimistic({ id: "pending", text, sender: "me" });
    await saveMessage(text);
  }

  return (
    <>
      <ul>{optimistic.map((m) => <li key={m.id}>{m.text}</li>)}</ul>
      <form action={send}>
        <input name="text" />
        <button type="submit">Send</button>
      </form>
    </>
  );
}

Context aufteilen, um Render-Kaskaden zu vermeiden

// Zwei Contexts: einer ändert sich selten, einer häufig
const ThemeContext = createContext<Theme>("light");
const NotificationsContext = createContext<Notification[]>([]);

// Eine Komponente, die nur ThemeContext konsumiert, rendert NICHT neu, wenn sich Notifications ändern

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Verwandte Skills