React Router V7

existential-birds/beagle/plugins/beagle-react/skills/react-router-v7

by existential-birdsd1a74899fbfec74974d1818e4cac7c3d54d44b65No license83 starsListed Oct 9, 2026Updated Oct 9, 2026Repository updated 3 weeks ago

React Router v7 best practices for data-driven routing. Use when implementing routes, loaders, actions, Form components, fetchers, navigation guards, protected routes, or URL search params. Triggers on createBrowserRouter, RouterProvider, useLoaderData, useActionData, useFetcher, NavLink, Outlet.

Instructions onlySoftware Development
AI-generated overview

React Router v7 guidance for data-driven routing, covering routes, loaders, actions, forms, fetchers and navigation.

What it does
This skill provides best-practice guidance for React Router v7 in data-driven routing setups. It explains router configuration with createBrowserRouter and RouterProvider, nested routes with Outlet, dynamic segments and splats, and decision gates for choosing between Form and useFetcher or between loader and useEffect. It also points to reference documents on loaders, actions, navigation and advanced topics such as error boundaries and protected routes.
When to use it
Use it when implementing or reviewing React Router v7 routes, loaders, actions, Form components, fetchers, navigation guards, protected routes or URL search params. It fits questions about createBrowserRouter, RouterProvider, useLoaderData, useActionData, useFetcher, NavLink or Outlet.
Requirements
No scripts or runtime dependencies; it is an instructions-only skill. The agent needs no packages, credentials or network access beyond reading the bundled reference documents.

React Router v7 Best Practices

Quick Reference

Router Setup (Data Mode):

tsx
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} />);

Framework Mode (Vite plugin):

ts
// routes.tsimport { index, route } from "@react-router/dev/routes";
export default [  index("./home.tsx"),  route("products/:pid", "./product.tsx"),];

Route Configuration

Nested Routes with Outlets

tsx
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>  );}

Dynamic Segments and Splats

tsx
{ path: "teams/:teamId" }           // params.teamId{ path: ":lang?/categories" }       // Optional segment{ path: "files/*" }                 // Splat: params["*"]

Key Decision Points

Form vs Fetcher

Use <Form>: Creating/deleting with URL change, adding to history Use useFetcher: Inline updates, list operations, popovers - no URL change

Loader vs useEffect

Use loader: Data before render, server-side fetch, automatic revalidation Use useEffect: Client-only data, user-interaction dependent, subscriptions

Gates (decision sequencing)

Answer in order. Pass means the condition is true; pick the API on the same line and stop.

<Form> vs useFetcher

  1. Must the URL or history stack change (bookmark/share, back returns to prior screen)?
    • Pass → <Form> / route action (or useSubmit + navigation). Stop.
    • Fail → Step 2.
  2. Mutation stays on the same route (inline edit, modal, list row, no address change)?
    • Pass → useFetcher(). Stop.
    • Fail → Re-check step 1; you may need a dedicated action route or POST to the current URL.

loader vs useEffect

  1. Is data needed for correct first render (or your intended <Suspense> boundary) for this route?
    • Pass → loader (Framework: clientLoader when appropriate). Stop.
    • Fail → Step 2.
  2. Fetch only after mount from user action, timer, or subscription (not route entry)?
    • Pass → useEffect / event handlers. Stop.
    • Fail → Prefer loader + revalidation over an effect that mirrors navigation.

Additional Documentation

  • Data Loading: See references/loaders.md [blocked] for loader patterns, parallel loading, search params
  • Mutations: See references/actions.md [blocked] for actions, Form, fetchers, validation
  • Navigation: See references/navigation.md [blocked] for Link, NavLink, programmatic nav
  • Advanced: See references/advanced.md [blocked] for error boundaries, protected routes, lazy loading

Mode Comparison

FeatureFramework ModeData ModeDeclarative Mode
SetupVite plugincreateBrowserRouter<BrowserRouter>
Type SafetyAuto-generated typesManualManual
SSR SupportBuilt-inManualLimited
Use CaseFull-stack appsSPAs with controlSimple/legacy

Source and attribution

Source:existential-birds/beagleinplugins/beagle-react/skills/react-router-v7at commitd1a7489

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal