useRouteLoaderData
Accessing Parent Route Data
Child routes can access loader data from parent routes using useRouteLoaderData. This is useful for sharing data like user info, config, or any data loaded by a parent without needing to reload it.
Parent Route
This parent route has a loader that fetches shared data. The child route below accesses this data using useRouteLoaderData("/features/data/parent-data").
Child Route (No Loader)
This child route does not have its own loader. Instead, it accesses the parent route's loader data using useRouteLoaderData with the parent's route ID.
Data from Parent Loader
- Parent Message
- Hello from parent loader!
- Loaded At
- 2026-01-11T20:42:16.713Z
- Theme
- dark
- Version
- 1.0.0
Parent Route Code
Example Code
// routes/features/data/parent-data/main.tsx
import { Outlet } from "react-router";
import type { RouteLoaderArgs } from "@udibo/juniper";
export interface ParentLoaderData {
parentMessage: string;
loadedAt: string;
sharedConfig: { theme: string; version: string };
}
export async function loader(_args: RouteLoaderArgs): Promise<ParentLoaderData> {
return {
parentMessage: "Hello from parent loader!",
loadedAt: new Date().toISOString(),
sharedConfig: { theme: "dark", version: "1.0.0" },
};
}
export default function ParentLayout() {
return (
<div>
<h2>Parent Route</h2>
<Outlet />
</div>
);
}Child Route Code
Example Code
// routes/features/data/parent-data/index.tsx
import { useRouteLoaderData } from "react-router";
import type { ParentLoaderData } from "./main.tsx";
export default function ChildRoute() {
// Use the parent route's path as the route ID
const parentData = useRouteLoaderData(
"/features/data/parent-data"
) as ParentLoaderData;
return (
<div>
<p>Message: {parentData.parentMessage}</p>
<p>Theme: {parentData.sharedConfig.theme}</p>
</div>
);
}Note: With path-based route IDs, accessing parent data is intuitive—just use the parent route's URL path as the ID. This makes your code more readable and maintainable.