React Router v7 Best Practices
Quick Reference
Router Setup (Data Mode):
Framework Mode (Vite plugin):
Route Configuration
Nested Routes with Outlets
Dynamic Segments and Splats
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
- Must the URL or history stack change (bookmark/share, back returns to prior screen)?
- Pass →
<Form>/ routeaction(oruseSubmit+ navigation). Stop. - Fail → Step 2.
- Pass →
- 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.
- Pass →
loader vs useEffect
- Is data needed for correct first render (or your intended
<Suspense>boundary) for this route?- Pass →
loader(Framework:clientLoaderwhen appropriate). Stop. - Fail → Step 2.
- Pass →
- 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.
- Pass →
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


