react-router-data-mode について
ReactアプリにReact Router Dataモードを導入する開発者向けのガイダンススキルです。ルートオブジェクトの設定、データ読み込みや変更処理に加え、処理中表示と楽観的UIのパターンを説明します。
主な機能
- 01createBrowserRouterの設定
- 02ルートオブジェクトの構成
- 03loaderによるデータ読み込み
- 04actionとフォーム変更
- 05処理中表示と楽観的UI
活用シーン
- 01既存アプリへのデータ読み込み追加
- 02ルートオブジェクトの設定
- 03フォーム送信の処理
- 04楽観的な変更結果の表示
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ remix-run/ agent-skills --skill react-router-data-modeインストール後、Claude Code で/react-router-data-modeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/actions.mddata-loading.mdnavigation.mdpending-ui.mdroute-object.mdrouting.mdssr.md詳細
React Router データモード
データモードでは、createBrowserRouter と RouterProvider を使用して、フレームワークの Vite プラグインなしでデータの読み込み、アクション、保留中の UI を有効にします。データの読み込みや変更の機能を追加したい既存の React アプリケーションに最適です。
適用する場面
- ルートオブジェクトを使って
createBrowserRouterを使用する場合 - ルートの
loaderプロパティを使ってデータを読み込む場合 actionプロパティを使って変更を処理する場合<Link>、<NavLink>、<Form>、redirect、useNavigateを使って移動する場合useNavigationを使って保留中/読み込み中の UI 状態を実装する場合- 移動せずに変更を行うために
useFetcherを使用する場合
参考資料
特定の API/概念について詳しく知るには、該当する参考資料を読み込んでください。
| 参考資料 | 使用する場面 |
|---|---|
references/routing.md | ルート、ネストされたルート、レイアウトの設定 |
references/route-object.md | ルートオブジェクトのプロパティを理解する |
references/data-loading.md | ローダーを使ったデータの読み込み |
references/actions.md | フォーム、変更、検証の処理 |
references/navigation.md | リンク、プログラムによる移動、リダイレクト |
references/pending-ui.md | 読み込み状態、楽観的 UI |
references/ssr.md | データモードでのサーバーサイドレンダリング |
重要なパターン
以下は、必ず従うべき重要なパターンです。詳細については、該当する参考資料を読み込んでください。
基本的なルーターの設定
import { createBrowserRouter, RouterProvider } from "react-router";
const router = createBrowserRouter([
{
path: "/",
Component: Root,
children: [
{ index: true, Component: Home },
{ path: "about", Component: About },
],
},
]);
ReactDOM.createRoot(root).render(<RouterProvider router={router} />);
フォームと変更
検索フォーム — setSearchParams を使った onSubmit ではなく、<Form method="get"> を使用してください。
// ✅ Correct
<Form method="get">
<input name="q" />
</Form>
// ❌ Wrong - don't manually handle search params
<form onSubmit={(e) => { e.preventDefault(); setSearchParams(...) }}>
インライン変更 — ページ遷移が発生する <Form> ではなく、useFetcher を使用してください。
const fetcher = useFetcher();
const optimistic = fetcher.formData
? fetcher.formData.get("favorite") === "true"
: isFavorite;
<fetcher.Form method="post" action={`/favorites/${id}`}>
<button>{optimistic ? "★" : "☆"}</button>
</fetcher.Form>;
すべてのパターンについては、references/actions.md を参照してください。
楽観的 UI のパターン
fetcher.formData を使って、想定される結果をすぐに表示します。
function FavoriteButton({ itemId, isFavorite }) {
const fetcher = useFetcher();
// Optimistic: use pending form data, fallback to server state
const optimistic = fetcher.formData
? fetcher.formData.get("favorite") === "true"
: isFavorite;
return (
<fetcher.Form method="post" action={`/items/${itemId}/favorite`}>
<input type="hidden" name="favorite" value={String(!optimistic)} />
<button>{optimistic ? "★" : "☆"}</button>
</fetcher.Form>
);
}
すべてのパターンについては、references/pending-ui.md を参照してください。
詳細なドキュメント
React Router に関する内容がこれらの参考資料で扱われていない場合は、公式ドキュメントを検索できます。