react-router-v7 について
React Router v7でアプリを開発する人向けのリファレンススキルです。ルーティング、データ読み込み、更新処理、モード選択を実践的な判断基準で整理しています。
主な機能
- 01ネストしたルートと動的セグメント
- 02Framework、Data、Declarative各モード
- 03loaderとuseEffectの選択指針
- 04FormとuseFetcherの選択指針
- 05データ読み込みとナビゲーションのリファレンス
活用シーン
- 01アプリに適したルーティングモードの選択
- 02初回表示に必要なデータの読み込み
- 03画面遷移を伴わないインライン更新
- 04ネストしたパラメーター付きルートの設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ existential-birds/ beagle --skill react-router-v7インストール後、Claude Code で/react-router-v7を入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
ACTIONS.mdADVANCED.mdLOADERS.mdNAVIGATION.mdreferences/actions.mdadvanced.mdloaders.mdnavigation.md詳細
React Router v7 のベストプラクティス
クイックリファレンス
ルーターの設定(データモード):
import { createBrowserRouter, RouterProvider } from "react-router";
const router = createBrowserRouter([
{
path: "/",
Component: Root,
ErrorBoundary: RootErrorBoundary,
loader: rootLoader,
children: [
{ index: true, Component: Home },
{ path: "products/:productId", Component: Product, loader: productLoader },
],
},
]);
ReactDOM.createRoot(root).render(<RouterProvider router={router} />);
フレームワークモード(Vite プラグイン):
// routes.ts
import { index, route } from "@react-router/dev/routes";
export default [
index("./home.tsx"),
route("products/:pid", "./product.tsx"),
];
ルートの設定
Outlet を使用したネストされたルート
createBrowserRouter([
{
path: "/dashboard",
Component: Dashboard,
children: [
{ index: true, Component: DashboardHome },
{ path: "settings", Component: Settings },
],
},
]);
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
<Outlet /> {/* Renders child routes */}
</div>
);
}
動的セグメントとスプラット
{ path: "teams/:teamId" } // params.teamId
{ path: ":lang?/categories" } // Optional segment
{ path: "files/*" } // Splat: params["*"]
主な判断ポイント
Form と Fetcher
<Form> を使用する場合:URL を変更して作成・削除する場合、履歴に追加する場合
useFetcher を使用する場合:インライン更新、リスト操作、ポップオーバーなど、URL を変更しない場合
Loader と useEffect
loader を使用する場合:レンダリング前のデータ取得、サーバーサイドでのフェッチ、自動再検証
useEffect を使用する場合:クライアントのみのデータ、ユーザー操作に依存する処理、サブスクリプション
判断基準(順番に判断)
順番に回答してください。Pass は条件が真であることを意味します。同じ行にある API を選択して、そこで終了します。
<Form> と useFetcher
- URL または履歴スタックを変更する必要がありますか(ブックマーク/共有する場合、戻ると前の画面に戻る場合)?
- Pass →
<Form>/ ルートのaction(またはuseSubmit+ ナビゲーション)。終了します。 - Fail → ステップ 2。
- Pass →
- ミューテーションは同じルートにとどまりますか(インライン編集、モーダル、リスト行など、アドレスを変更しない場合)?
- Pass →
useFetcher()。終了します。 - Fail → ステップ 1 を再確認してください。専用のアクションルート、または現在の URL への POST が必要な場合があります。
- Pass →
loader と useEffect
- このルートの正しい初回レンダリング(または意図した
<Suspense>境界)にデータが必要ですか?- Pass →
loader(フレームワークモードでは、適切な場合にclientLoader)。終了します。 - Fail → ステップ 2。
- Pass →
- ルートに入ったときではなく、ユーザー操作、タイマー、またはサブスクリプションをきっかけに、マウント後にのみフェッチしますか?
- Pass →
useEffect/ イベントハンドラー。終了します。 - Fail → ナビゲーションを反映する
effectよりも、loader + 再検証を優先してください。
- Pass →
関連ドキュメント
- データの読み込み:references/loaders.md を参照してください。loader のパターン、並列読み込み、検索パラメーターについて説明しています。
- ミューテーション:references/actions.md を参照してください。action、Form、fetcher、バリデーションについて説明しています。
- ナビゲーション:references/navigation.md を参照してください。Link、NavLink、プログラムによるナビゲーションについて説明しています。
- 高度なトピック:references/advanced.md を参照してください。エラーバウンダリー、保護されたルート、遅延読み込みについて説明しています。
モードの比較
| 機能 | フレームワークモード | データモード | 宣言的モード |
|---|---|---|---|
| 設定 | Vite プラグイン | createBrowserRouter | <BrowserRouter> |
| 型安全性 | 型を自動生成 | 手動 | 手動 |
| SSR サポート | 組み込み | 手動 | 限定的 |
| 用途 | フルスタックアプリ | 制御性の高い SPA | シンプル/レガシー |
コメント
Markdown 対応