React Router V7

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

作者 existential-birdsd1a74899fbfec74974d1818e4cac7c3d54d44b65无许可证83 个星标收录于 2026年10月9日更新于 2026年10月9日仓库3周前更新

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.

AI 生成的概览

React Router v7 数据驱动路由最佳实践,涵盖路由、loader、action、表单、fetcher 与导航。

功能
该技能提供 React Router v7 在数据驱动路由场景下的最佳实践指导。内容涵盖使用 createBrowserRouter 与 RouterProvider 配置路由、通过 Outlet 实现嵌套路由、动态段与 splat,以及在选择 Form 与 useFetcher、loader 与 useEffect 时的决策顺序。它还指向关于 loader、action、导航以及错误边界、受保护路由等进阶主题的参考文档。
适用场景
在实现或审查 React Router v7 的路由、loader、action、Form 组件、fetcher、导航守卫、受保护路由或 URL 搜索参数时使用。适用于涉及 createBrowserRouter、RouterProvider、useLoaderData、useActionData、useFetcher、NavLink 或 Outlet 的问题。
运行要求
无需脚本或运行时依赖,仅为指令型技能。除阅读随附的参考文档外,代理不需要任何软件包、凭据或网络访问。

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

来源与署名

来源:existential-birds/beagle位于plugins/beagle-react/skills/react-router-v7提交d1a7489

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架