react-coder について
react-coderは、TypeScript、フック、保守しやすいパターンでモダンなReactコンポーネントを作るコーディングスキルです。コンポーネント構成やパフォーマンス手法に加え、実装内容の報告形式も示します。
主な機能
- 01フックを使った関数コンポーネント
- 02Propsとイベントハンドラーの型付け
- 03再利用可能なコンポーネント構成
- 04メモ化とコード分割
- 05実装内容の報告形式
活用シーン
- 01型付きReact UIコンポーネントの作成
- 02コンポーネントファイルの整理
- 03再レンダーの最適化
- 04コンポーネント実装の説明準備
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ majesticlabs-dev/ majestic-marketplace --skill react-coderインストール後、Claude Code で/react-coderを入力して読み込まれたか確認します。
詳細
React コーダー
TypeScript、フック、ベストプラクティスを使用して、モダンな React コンポーネントを作成します。クリーンでパフォーマンスに優れ、保守しやすいコードを作成します。
技術スタックの前提
| 技術 | デフォルト |
|---|---|
| React | 18+(並行機能を使用) |
| TypeScript | 型安全性のために使用 |
| コンポーネント | フックを使った関数コンポーネント |
| パッケージマネージャー | pnpm |
| ビルドツール | Vite または Next.js |
| スタイリング | Tailwind CSS |
| テスト | Vitest または Jest |
コンポーネントのパターン
基本的な関数コンポーネント
import { FC } from 'react';
interface ButtonProps {
label: string;
onClick: () => void;
variant?: 'primary' | 'secondary';
disabled?: boolean;
}
export const Button: FC<ButtonProps> = ({
label,
onClick,
variant = 'primary',
disabled = false
}) => {
const baseClasses = 'px-4 py-2 rounded-md font-medium transition-colors';
const variantClasses = {
primary: 'bg-blue-600 text-white hover:bg-blue-700 disabled:bg-gray-400',
secondary: 'bg-white text-gray-700 border border-gray-300 hover:bg-gray-50'
};
return (
<button
onClick={onClick}
disabled={disabled}
className={`${baseClasses} ${variantClasses[variant]}`}
>
{label}
</button>
);
};
子要素を持つコンポーネント
import { FC, ReactNode } from 'react';
interface CardProps {
title: string;
children: ReactNode;
footer?: ReactNode;
}
export const Card: FC<CardProps> = ({ title, children, footer }) => {
return (
<div className="bg-white shadow rounded-lg overflow-hidden">
<div className="px-6 py-4 border-b border-gray-200">
<h3 className="text-lg font-medium text-gray-900">{title}</h3>
</div>
<div className="px-6 py-4">{children}</div>
{footer && (
<div className="px-6 py-4 bg-gray-50 border-t border-gray-200">
{footer}
</div>
)}
</div>
);
};
TypeScript のパターン
ジェネリクスを使った Props
interface SelectProps<T> {
options: T[];
value: T;
onChange: (value: T) => void;
getLabel: (option: T) => string;
getValue: (option: T) => string;
}
export function Select<T>({ options, value, onChange, getLabel, getValue }: SelectProps<T>) {
return (
<select
value={getValue(value)}
onChange={(e) => {
const selected = options.find(opt => getValue(opt) === e.target.value);
if (selected) onChange(selected);
}}
>
{options.map((option) => (
<option key={getValue(option)} value={getValue(option)}>
{getLabel(option)}
</option>
))}
</select>
);
}
イベントハンドラーの型
import { MouseEvent, ChangeEvent, KeyboardEvent } from 'react';
const handleClick = (e: MouseEvent<HTMLButtonElement>) => { ... }
const handleChange = (e: ChangeEvent<HTMLInputElement>) => { ... }
const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => { ... }
ファイル構成
src/
├── components/
│ ├── ui/ # Reusable UI components
│ │ ├── Button.tsx
│ │ ├── Card.tsx
│ │ └── Input.tsx
│ ├── forms/ # Form components
│ └── layout/ # Layout components
├── hooks/ # Custom hooks
│ ├── useApi.ts
│ ├── useForm.ts
│ └── useLocalStorage.ts
├── pages/ # Page components
├── types/ # TypeScript types
└── utils/ # Utility functions
パフォーマンスの最適化
| 手法 | 使用例 |
|---|---|
useMemo | コストの高い計算(並べ替え、フィルタリング) |
useCallback | メモ化された子コンポーネントに渡す関数 |
memo | 同じ Props で頻繁に再レンダリングされる純粋コンポーネント |
lazy + Suspense | ルートや大規模なコンポーネントのコード分割 |
出力形式
コンポーネントを作成した後、以下を示します。
- 作成したファイル - パスを含む新規ファイルの一覧
- コンポーネント - 主なコンポーネントとその目的
- フック - 作成したカスタムフック
- 型 - 定義した TypeScript のインターフェース/型
- 次のステップ - テスト、統合、スタイリング
コメント
Markdown 対応