К основному содержанию
скилл CX Codex

react-patterns · giuseppe-trisciuoglio — скилл React 19 для Claude Code и Cursor

Подсказывает агенту паттерны React 19: Server Components, Server Actions, useOptimistic, Suspense. Пригодится, когда пишете приложение на Next.js App Router.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add giuseppe-trisciuoglio/developer-kit --skill react-patterns -a claude-code
Открыть на GitHub

Что делает react-patterns

Скилл описывает, как писать компоненты React 19 и Next.js App Router: где нужен Server Component, а где клиентский, как обернуть асинхронный код в Suspense, как связать форму с Server Action. Внутри — таблица соответствия «задача → хук»: useState для простого состояния, useReducer для машин состояний, useTransition для неспешных обновлений, useOptimistic для мгновенного отклика на мутацию, useActionState для результата серверного действия. Есть готовые примеры кода, которые можно копировать: список задач с оптимистичным добавлением, форма создания поста с валидацией через Zod и revalidatePath, кастомный хук useOnlineStatus.

Агенту скилл задаёт порядок шагов: определить тип компонента, выбрать хуки, типизировать пропсы, обернуть загрузку данных в Suspense, добавить ErrorBoundary, а Server Actions проверить на невалидном и валидном вводе. Инструменты у скилла ограничены чтением и правкой файлов плюс Bash, Grep и Glob — запускать что-то вне проекта он не станет.

Серверные действия с публичными эндпоинтами скилл советует валидировать схемой, и это стоит делать до того, как форма уедет в прод: без проверки на сервере клиентская валидация ничего не гарантирует. Для оптимизации предлагается React Compiler либо ручное мемоизирование через useMemo и useCallback.

Какие задачи решает

  • разложить страницу на Server и Client Components
  • сделать оптимистичное добавление записи без перезагрузки
  • связать форму с Server Action и показать ошибки полей
  • обернуть загрузку данных в Suspense и обработать ошибку
  • перевести классовый компонент на хуки

Примеры запросов агенту

  • Помоги написать Server Component для страницы товара и клиентскую кнопку добавления в корзину
  • Сделай форму создания поста через useActionState с валидацией Zod
  • Добавь оптимистичное обновление списка задач через useOptimistic

Как установить react-patterns

1Через Skills CLI (Vercel)

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

2Вручную: положить файлы

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

Папка скилла целиком; для одного проекта — .claude/skills/react-patterns/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора93

tailwind-css-patterns Скилл с готовыми паттернами Tailwind CSS: адаптивные сетки, карточки, формы, тёмная тема. Пригодится, когда агент верстает компоненты на React, Vue или Svelte. CX Codex +1 17 700установок drizzle-orm-patterns Помогает писать типобезопасные схемы, запросы и миграции на Drizzle ORM. Пригодится при работе с таблицами, связями и транзакциями. CX Codex +1 5 400установок nextjs-performance Скилл по оптимизации Next.js: Core Web Vitals, картинки и шрифты, кеширование, стриминг, размер бандла. Пригодится, когда сайт тормозит и надо понять, с чего начать. CX Codex +1 4 900установок unit-test-bean-validation Скилл помогает писать изолированные тесты для Jakarta Bean Validation на JUnit 5 без запуска Spring. Пригодится при проверке DTO и кастомных валидаторов. CX Codex +1 4 900установок tailwind-design-system Скилл помогает развернуть дизайн-систему на Tailwind CSS v4.1+ и shadcn/ui. Он настраивает токены в формате oklch, CSS-переменные и обёртки над базовыми компонентами. CX Codex +1 4 500установок spring-boot-test-patterns Скилл подсказывает агенту, как писать тесты Spring Boot: юнит-тесты с Mockito, срезы @DataJpaTest и @WebMvcTest, интеграционные с Testcontainers. CX Codex +1 4 300установок react-code-review Скилл проверяет React-компоненты и хуки перед мержем: архитектура, зависимости в useEffect, доступность, типы. Полезен, когда правки уже готовы и нужен разбор по серьёзности. CX Codex +1 4 300установок spring-boot-rest-api-standards Задаёт правила проектирования REST API в Spring Boot: от структуры URL и статус-кодов до валидации DTO и перехвата ошибок. CX Codex +1 4 200установок

Другие версии react-patterns

Похожие

react-expert https://github.com/Jeffallan Скилл для разработки на React 18+, Next.js App Router и create-react-app. Генерирует компоненты, хуки, чинит рендер и переводит классовые компоненты на функциональные. CX Codex +1 5 500установок react-dev softaworks Скилл помогает писать строго типизированный код на React 18–19 и переходить на новые API вроде useActionState. CX Codex +1 4 100установок react-19 prowler-cloud Скилл для работы с React 19 и React Compiler: без ручной мемоизации, серверные компоненты первыми, ref как проп. CX Codex +1 671установок nextjs-app-router-patterns Seth Hobson Помогает строить приложения на Next.js App Router: выбирать режим рендеринга, организовывать маршруты и получать данные. Подойдёт при миграции с Pages Router или работе с Server Components. CX Codex 32 529установок nextjs-architecture-expert davila7 Субагент для Claude, который разбирает архитектуру Next.js: App Router, Server Components, миграцию и производительность. 4 935установок typescript-react-patterns agent-skills Скилл с 33 правилами типизации React на TypeScript: пропсы, хуки, события, refs, дженерики и контекст. Пригодится, когда агент пишет компоненты и лезет в типы. CX Codex +1 1 100установок

Рядом в теме «Фронтенд и UI»

Всё по теме «Фронтенд и UI» →

Вопросы о react-patterns

Как установить react-patterns в Claude?

Выполните npx skills add giuseppe-trisciuoglio/developer-kit --skill react-patterns -a claude-code. Скилл появится в ~/.claude/skills/react-patterns/SKILL.md.

Что делает react-patterns?

Даёт агенту паттерны React 19 и Next.js App Router: Server Components, Server Actions, useOptimistic, useActionState, useTransition, границы Suspense и типизацию на TypeScript. Плюс примеры кода, которые можно взять как есть.

Для каких платформ подходит скилл?

Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI и OpenCode. Для каждой платформы своя команда установки, файл скилла кладётся в её каталог.

Исходный текст

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

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой