Script Valley
React.js: Complete Course
React Router and NavigationLesson 5.5

React Router data APIs: loaders and actions

createBrowserRouter, loader function, useLoaderData, action function, Form component, defer and Await, error boundaries with errorElement

React Router Data APIs

React Router v6.4+ introduced data APIs that move data fetching out of components and into route definitions. Loaders fetch data before rendering; actions handle form submissions.

Setup with createBrowserRouter

import { createBrowserRouter, RouterProvider, useLoaderData } from 'react-router-dom';

async function usersLoader() {
  const res = await fetch('/api/users');
  if (!res.ok) throw new Response('Not Found', { status: 404 });
  return res.json();
}

function UsersPage() {
  const users = useLoaderData();
  return <ul>{users.map(u => <li key={u.id}>{u.name}</li>)}</ul>;
}

const router = createBrowserRouter([
  {
    path: '/users',
    element: <UsersPage />,
    loader: usersLoader,
    errorElement: <ErrorPage />,
  },
]);

function App() {
  return <RouterProvider router={router} />;
}

Loaders run before the component renders, eliminating the loading-state flicker of useEffect data fetching. Set errorElement on routes to catch loader errors. Actions handle POST requests from React Router's <Form> component and revalidate loader data automatically after submission.