routes.ts で参照されるファイルは、ルートモジュールと呼ばれます。
route("teams/:teamId", "./team.tsx"),
// route module ^^^^^^^^
ルートモジュールは、React Router のフレームワーク機能の基盤であり、以下を定義します。
このガイドでは、すべてのルートモジュール機能の概要を簡単に説明します。入門ガイドの残りの部分では、これらの機能をより詳細に説明します。
default)ルートが一致したときにレンダリングされるコンポーネントを定義します。
export default function MyRouteComponent() {
return (
<div>
<h1>Look ma!</h1>
<p>
I'm still using React Router after like 10 years.
</p>
</div>
);
}
loaderルートローダーは、ルートコンポーネントがレンダリングされる前に、データを提供します。サーバーレンダリング時、またはプリレンダリングによるビルド時にのみ、サーバー上で呼び出されます。
export async function loader() {
return { message: "Hello, world!" };
}
export default function MyRoute({ loaderData }) {
return <h1>{loaderData.message}</h1>;
}
関連項目
clientLoaderブラウザでのみ呼び出されるルートクライアントローダーは、ルートローダーに加えて、またはルートローダーの代わりに、ルートコンポーネントにデータを提供します。
export async function clientLoader({ serverLoader }) {
// call the server loader
const serverData = await serverLoader();
// And/or fetch data on the client
const data = getDataFromClient();
// Return the data to expose through useLoaderData()
return data;
}
クライアントローダーは、関数の hydrate プロパティを設定することにより、サーバーレンダリングされたページの初期ページロードハイドレーションに参加できます。
export async function clientLoader() {
// ...
}
clientLoader.hydrate = true as const;
as const を使用すると、TypeScript は clientLoader.hydrate の型を boolean ではなく true と推論します。これにより、React Router は clientLoader.hydrate の値に基づいて loaderData の型を導出できます。
関連項目
actionルートアクションを使用すると、<Form>、useFetcher、および useSubmit から呼び出されたときに、ページ上のすべてのローダーデータの自動再検証を伴うサーバー側のデータ変更が可能になります。
// route("/list", "./list.tsx")
import { Form } from "react-router";
import { TodoList } from "~/components/TodoList";
// this data will be loaded after the action completes...
export async function loader() {
const items = await fakeDb.getItems();
return { items };
}
// ...so that the list here is updated automatically
export default function Items({ loaderData }) {
return (
<div>
<List items={loaderData.items} />
<Form method="post" navigate={false} action="/list">
<input type="text" name="title" />
<button type="submit">Create Todo</button>
</Form>
</div>
);
}
export async function action({ request }) {
const data = await request.formData();
const todo = await fakeDb.addItem({
title: data.get("title"),
});
return { ok: true };
}
clientActionルートアクションと同様ですが、ブラウザでのみ呼び出されます。
export async function clientAction({ serverAction }) {
fakeInvalidateClientSideCache();
// can still call the server action if needed
const data = await serverAction();
return data;
}
関連項目
ErrorBoundary他のルートモジュール API がスローすると、ルートコンポーネントの代わりにルートモジュール ErrorBoundary がレンダリングされます。
import {
isRouteErrorResponse,
useRouteError,
} from "react-router";
export function ErrorBoundary() {
const error = useRouteError();
if (isRouteErrorResponse(error)) {
return (
<div>
<h1>
{error.status} {error.statusText}
</h1>
<p>{error.data}</p>
</div>
);
} else if (error instanceof Error) {
return (
<div>
<h1>Error</h1>
<p>{error.message}</p>
<p>The stack trace is:</p>
<pre>{error.stack}</pre>
</div>
);
} else {
return <h1>Unknown Error</h1>;
}
}
HydrateFallback初期ページの読み込み時に、ルートコンポーネントはクライアントローダーが完了した後にのみレンダリングされます。エクスポートされている場合、HydrateFallback はルートコンポーネントの代わりにすぐにレンダリングできます。
export async function clientLoader() {
const data = await fakeLoadLocalGameData();
return data;
}
export function HydrateFallback() {
return <p>Loading Game...</p>;
}
export default function Component({ loaderData }) {
return <Game data={loaderData} />;
}
headersルートヘッダーは、サーバーレンダリング時にレスポンスと共に送信される HTTP ヘッダーを定義します。
export function headers() {
return {
"X-Stretchy-Pants": "its for fun",
"Cache-Control": "max-age=300, s-maxage=3600",
};
}
handleルートハンドルを使用すると、アプリケーションは useMatches のルートマッチに何でも追加して、抽象化(パンくずリストなど)を作成できます。
export const handle = {
its: "all yours",
};
linksルートリンクは、ドキュメントの <head> にレンダリングされる <link> 要素 を定義します。
export function links() {
return [
{
rel: "icon",
href: "/favicon.png",
type: "image/png",
},
{
rel: "stylesheet",
href: "https://example.com/some/styles.css",
},
{
rel: "preload",
href: "/images/banner.jpg",
as: "image",
},
];
}
すべてのルートリンクは集約され、通常はアプリルートにレンダリングされる <Links /> コンポーネントを介してレンダリングされます。
import { Links } from "react-router";
export default function Root() {
return (
<html>
<head>
<Links />
</head>
<body />
</html>
);
}
metaルートメタは、ドキュメントの <head> にレンダリングされるメタタグを定義します。
export function meta() {
return [
{ title: "Very cool app" },
{
property: "og:title",
content: "Very cool app",
},
{
name: "description",
content: "This app is the best",
},
];
}
すべてのルートのメタは集約され、通常はアプリルートにレンダリングされる <Meta /> コンポーネントを介してレンダリングされます
import { Meta } from "react-router";
export default function Root() {
return (
<html>
<head>
<Meta />
</head>
<body />
</html>
);
}
関連項目
shouldRevalidateデフォルトでは、すべてのアクション後にすべてのルートが再検証されます。この関数を使用すると、ルートはデータに影響を与えないアクションの再検証をオプトアウトできます。
import type { ShouldRevalidateFunctionArgs } from "react-router";
export function shouldRevalidate(
arg: ShouldRevalidateFunctionArgs
) {
return true;
}
次へ: レンダリング戦略