React Router Data Mode

by remix-run33578aae4aa3MIT135 starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 3 months ago

Build React applications using React Router's data mode with createBrowserRouter and RouterProvider. Use when working with route objects, loaders, actions, Form, useFetcher, or pending/optimistic UI without the Vite plugin.

ArchivedInstructions onlySoftware Development
AI-generated overview

Guides building React apps with React Router data mode using createBrowserRouter, loaders, actions, and pending UI.

What it does
This skill provides instructions for building React applications with React Router's data mode, centered on createBrowserRouter and RouterProvider without the Vite plugin. It covers route objects, loaders, actions, navigation, useFetcher, and pending or optimistic UI, and points to seven reference files for detailed guidance on each topic. It produces implementation guidance and code patterns rather than runnable artifacts.
When to use it
Use it when adding data loading and mutation capabilities to an existing React application with React Router data mode. It fits work involving route objects, loaders, actions, Form, useFetcher, or pending and optimistic UI states.
Requirements
No scripts are included; it is instructions and reference documents only. The described approach targets React with the react-router package, and the skill notes that official documentation can be searched online.

React Router Data Mode

Data mode uses createBrowserRouter and RouterProvider to enable data loading, actions, and pending UI without the framework's Vite plugin. This is ideal for existing React applications that want to add data loading and mutation capabilities.

When to Apply

  • Using createBrowserRouter with route objects
  • Loading data with loader property on routes
  • Handling mutations with action property
  • Navigating with <Link>, <NavLink>, <Form>, redirect, and useNavigate
  • Implementing pending/loading UI states with useNavigation
  • Using useFetcher for mutations without navigation

References

Load the relevant reference for detailed guidance on the specific API/concept:

ReferenceUse When
references/routing.mdConfiguring routes, nested routes, layout
references/route-object.mdUnderstanding route object properties
references/data-loading.mdLoading data with loaders
references/actions.mdHandling forms, mutations, validation
references/navigation.mdLinks, programmatic navigation, redirects
references/pending-ui.mdLoading states, optimistic UI
references/ssr.mdServer-side rendering with data mode

Critical Patterns

These are the most important patterns to follow. Load the relevant reference for full details.

Basic Router Setup

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

Forms & Mutations

Search forms - use <Form method="get">, NOT onSubmit with setSearchParams:

tsx
// ✅ Correct<Form method="get">  <input name="q" /></Form>
// ❌ Wrong - don't manually handle search params<form onSubmit={(e) => { e.preventDefault(); setSearchParams(...) }}>

Inline mutations - use useFetcher, NOT <Form> (which causes page navigation):

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

See references/actions.md for complete patterns.

Optimistic UI Pattern

Use fetcher.formData to show expected results immediately:

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

See references/pending-ui.md for complete patterns.

Further Documentation

If anything related to React Router is not covered in these references, you can search the official documentation:

https://reactrouter.com/docs

Source and attribution

Source:remix-run/agent-skillsinskills/react-router-data-modeat commit33578aa

License: MIT

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

Report or request removal