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

react-native · alinaqi — скилл для Claude Code: паттерны мобильных приложений

Скилл задаёт структуру проекта, паттерны компонентов и правила тестирования для React Native. Пригодится, когда агент правит .tsx или код под iOS и Android.

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

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

Скилл включается, когда работа идёт с файлами **/*.tsx, **/*.jsx, каталогами ios/, android/ или app.json. Он описывает структуру проекта: чистую бизнес-логику в src/core/, переиспользуемые компоненты, экраны со своими хуками, навигацию, стор и утилиты.

Внутри — набор правил по коду. Функциональные компоненты, логика вынесена в хуки, интерфейс пропсов прописан явно. Локальный стейт через useState, глобальный — на Zustand, серверный — на React Query. Для тестов компонентов и хуков используется React Native Testing Library.

Платформенные различия скилл советует держать через Platform.select, а сложные случаи разносить по файлам Component.ios.tsx и Component.android.tsx. Отдельный список антипаттернов: инлайн-стили, логика в рендере, индекс как ключ в списках, мутация стейта напрямую. Скилл не вызывается вручную — он подключается сам по путям.

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

  • разложить экран на презентационный компонент и хук с логикой
  • вынести общий код под iOS и Android в отдельные файлы
  • покрыть компонент тестом на нажатие и на заблокированное состояние
  • перевести серверные данные на React Query с инвалидацией кэша
  • убрать инлайн-стили и анонимные функции из пропсов

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

  • Разбей HomeScreen на компонент и хук useHome, логику убери из рендера
  • Сделай тень через Platform.select для iOS и Android
  • Напиши тест для Button: нажатие вызывает onPress, а в disabled — нет

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

1Через Skills CLI (Vercel)

npx skills add alinaqi/maggy --skill react-native -a claude-code

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

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

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

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

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

android-java Скилл для работы с Android-проектами на Java: подсказывает структуру MVVM, ViewBinding и тесты на Espresso. CX Codex +1 667установок supabase Скилл для работы с Supabase CLI, миграциями PostgreSQL, политиками RLS и Deno Edge Functions. Пригодится при локальной разработке бэкенда. CX Codex +1 645установок code-deduplication Скилл ведёт CODE_INDEX.md с функциями и компонентами проекта, чтобы агент проверял, что уже написано, до создания новой утилиты. CX Codex +1 581установок user-journeys Скилл помогает фиксировать пользовательские пути, проверять UX и проектировать сценарии восстановления после ошибок. Пригодится при составлении сценариев в папке _project_specs. CX Codex +1 581установок aws-dynamodb Скилл учит агента проектировать базы по методу single-table design и собирать запросы через AWS SDK v3 для TypeScript или Python. CX Codex +1 522установок klaviyo Скилл для работы с Klaviyo из редактора: профили покупателей, трекинг событий, кампании, флоу и сегментация. Пригодится, когда нужно подключить маркетинг к магазину. CX Codex +1 517установок aeo-optimization Структурирует контент сайта для цитирования в ChatGPT, Perplexity и Google AI Overviews. Пригодится при оформлении продуктовых страниц и баз знаний под поисковые ответы нейросетей. CX Codex +1 437установок nodejs-backend Скилл задаёт структуру Node.js-проекта и готовые шаблоны для Express, Fastify и репозиториев. Подключается, когда агент правит код в src/api, src/routes или src/server. CX Codex +1 434установок

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

Похожие

expo-react-native-typescript Mindrally Скилл задаёт агенту правила разработки мобильных приложений на Expo, React Native и TypeScript: структура файлов, навигация, состояние, тесты. CX Codex +1 2 200установок react-native-expert https://github.com/Jeffallan Скилл для агентов ИИ-кодинга: помогает собирать мобильные приложения на React Native и Expo — навигация, нативные модули, скорость списков, код под iOS и Android. CX Codex +1 4 900установок writing-react-native-storybook-stories storybookjs Помогает агенту писать и править истории React Native по формату CSF: args, argTypes, декораторы, параметры аддонов и портируемые истории для тестов. CX Codex +1 681установок react-native-cursor-rules Mindrally Набор правил React Native для ИИ-агента: TypeScript, функциональные компоненты, оптимизация ререндеров и FlatList. Пригодится, когда агент пишет код для мобильного приложения. CX Codex +1 670установок expo-react-native-coder pproenca Скилл с 50 правилами и шаблонами кода для разработки мобильных приложений на Expo и React Native. Пригодится при сборке экранов, навигации и авторизации. CX Codex +1 409установок react-native-expo-cursorrules-prompt-file PatrickJS Правило для Cursor, которое задаёт агенту стек и структуру проекта на React Native с Expo. Пригодится, когда нужно, чтобы код в проекте писался единообразно. ★ 41 011звёзд репо

Рядом в теме «Мобильная разработка»

Всё по теме «Мобильная разработка» →

Вопросы о react-native

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

Выполни npx skills add alinaqi/maggy --skill react-native -a claude-code. Файл скилла окажется в ~/.claude/skills/react-native/SKILL.md.

Что делает скилл react-native?

Задаёт агенту структуру проекта и паттерны для React Native: функциональные компоненты, хуки для логики, Zustand и React Query для стейта, тесты через React Native Testing Library.

Когда скилл включается сам?

Он привязан к путям **/*.tsx, **/*.jsx, ios/**, android/** и app.json. Вручную вызывать его не нужно.

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

SKILL.md · MIT
---
name: react-native
description: React Native mobile patterns, platform-specific code
when-to-use: When working on React Native mobile app code
user-invocable: false
paths: ["**/*.tsx", "**/*.jsx", "ios/**", "android/**", "app.json"]
effort: medium
---

# React Native Skill


---

## Project Structure

```
project/
├── src/
│   ├── core/                   # Pure business logic (no React)
│   │   ├── types.ts
│   │   └── services/
│   ├── components/             # Reusable UI components
│   │   ├── Button/
│   │   │   ├── Button.tsx
│   │   │   ├── Button.test.tsx
│   │   │   └── index.ts
│   │   └── index.ts            # Barrel export
│   ├── screens/                # Screen components
│   │   ├── Home/
│   │   │   ├── HomeScreen.tsx
│   │   │   ├── useHome.ts      # Screen-specific hook
│   │   │   └── index.ts
│   │   └── index.ts
│   ├── navigation/             # Navigation configuration
│   ├── hooks/                  # Shared custom hooks
│   ├── store/                  # State management
│   └── utils/                  # Utilities
├── __tests__/
├── android/
├── ios/
└── CLAUDE.md
```

---

## Component Patterns

### Functional Components Only
```typescript
// Good - simple, testable
interface ButtonProps {
  label: string;
  onPress: () => void;
  disabled?: boolean;
}

export function Button({ label, onPress, disabled = false }: ButtonProps): JSX.Element {
  return (
    <Pressable onPress={onPress} disabled={disabled}>
      <Text>{label}</Text>
    </Pressable>
  );
}
```

### Extract Logic to Hooks
```typescript
// useHome.ts - all logic here
export function useHome() {
  const [items, setItems] = useState<Item[]>([]);
  const [loading, setLoading] = useState(false);

  const refresh = useCallback(async () => {
    setLoading(true);
    const data = await fetchItems();
    setItems(data);
    setLoading(false);
  }, []);

  return { items, loading, refresh };
}

// HomeScreen.tsx - pure presentation
export function HomeScreen(): JSX.Element {
  const { items, loading, refresh } = useHome();
  
  return (
    <ItemList items={items} loading={loading} onRefresh={refresh} />
  );
}
```

### Props Interface Always Explicit
```typescript
// Always define props interface, even if simple
interface ItemCardProps {
  item: Item;
  onPress: (id: string) => void;
}

export function ItemCard({ item, onPress }: ItemCardProps): JSX.Element {
  ...
}
```

---

## State Management

### Local State First
```typescript
// Start with useState, escalate only when needed
const [value, setValue] = useState('');
```

### Zustand for Global State (if needed)
```typescript
// store/useAppStore.ts
import { create } from 'zustand';

interface AppState {
  user: User | null;
  setUser: (user: User | null) => void;
}

export const useAppStore = create<AppState>((set) => ({
  user: null,
  setUser: (user) => set({ user }),
}));
```

### React Query for Server State
```typescript
// hooks/useItems.ts
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';

export function useItems() {
  return useQuery({
    queryKey: ['items'],
    queryFn: fetchItems,
  });
}

export function useCreateItem() {
  const queryClient = useQueryClient();
  
  return useMutation({
    mutationFn: createItem,
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['items'] });
    },
  });
}
```

---

## Testing

### Component Testing with React Native Testing Library
```typescript
import { render, fireEvent } from '@testing-library/react-native';
import { Button } from './Button';

describe('Button', () => {
  it('calls onPress when pressed', () => {
    const onPress = jest.fn();
    const { getByText } = render(<Button label="Click me" onPress={onPress} />);
    
    fireEvent.press(getByText('Click me'));
    
    expect(onPress).toHaveBeenCalledTimes(1);
  });

  it('does not call onPress when disabled', () => {
    const onPress = jest.fn();
    const { getByText } = render(<Button label="Click me" onPress={onPress} disabled />);
    
    fireEvent.press(getByText('Click me'));
    
    expect(onPress).not.toHaveBeenCalled();
  });
});
```

### Hook Testing
```typescript
import { renderHook, act } from '@testing-library/react-hooks';
import { useCounter } from './useCounter';

describe('useCounter', () => {
  it('increments counter', () => {
    const { result } = renderHook(() => useCounter());
    
    act(() => {
      result.current.increment();
    });
    
    expect(result.current.count).toBe(1);
  });
});
```

---

## Platform-Specific Code

### Use Platform.select Sparingly
```typescript
import { Platform } from 'react-native';

const styles = StyleSheet.create({
  shadow: Platform.select({
    ios: {
      shadowColor: '#000',
      shadowOffset: { width: 0, height: 2 },
      shadowOpacity: 0.1,
    },
    android: {
      elevation: 2,
    },
  }),
});
```

### Separate Files for Complex Differences
```
Component/
├── Component.tsx          # Shared logic
├── Component.ios.tsx      # iOS-specific
├── Component.android.tsx  # Android-specific
└── index.ts
```

---

## React Native Anti-Patterns

- ❌ Inline styles - use StyleSheet.create
- ❌ Logic in render - extract to hooks
- ❌ Deep component nesting - flatten hierarchy
- ❌ Anonymous functions in props - use useCallback
- ❌ Index as key in lists - use stable IDs
- ❌ Direct state mutation - always use setter
- ❌ Mixing business logic with UI - keep core/ pure
- ❌ Ignoring TypeScript errors - fix them
- ❌ Large components - split into smaller pieces

© alinaqi · MIT · alinaqi/maggy

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

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

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