ルートは、URLセグメントとUI要素を関連付ける<Routes>
と<Route>
をレンダリングすることで設定されます。
import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter, Routes, Route } from "react-router";
import App from "./app";
const root = document.getElementById("root");
ReactDOM.createRoot(root).render(
<BrowserRouter>
<Routes>
<Route path="/" element={<App />} />
</Routes>
</BrowserRouter>
);
より大きなサンプル設定を以下に示します。
<Routes>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
<Route element={<AuthLayout />}>
<Route path="login" element={<Login />} />
<Route path="register" element={<Register />} />
</Route>
<Route path="concerts">
<Route index element={<ConcertsHome />} />
<Route path=":city" element={<City />} />
<Route path="trending" element={<Trending />} />
</Route>
</Routes>
ルートは、親ルート内にネストできます。
<Routes>
<Route path="dashboard" element={<Dashboard />}>
<Route index element={<Home />} />
<Route path="settings" element={<Settings />} />
</Route>
</Routes>
親のパスは子に自動的に含まれるため、この設定では"/dashboard"
と"/dashboard/settings"
の両方のURLが作成されます。
子ルートは、親ルート内の<Outlet/>
を通してレンダリングされます。
import { Outlet } from "react-router";
export default function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
{/* will either be <Home/> or <Settings/> */}
<Outlet />
</div>
);
}
path
のないルートは、子ルートに対して新しいネストを作成しますが、URLにセグメントを追加しません。
<Routes>
<Route element={<MarketingLayout />}>
<Route index element={<MarketingHome />} />
<Route path="contact" element={<Contact />} />
</Route>
<Route path="projects">
<Route index element={<ProjectsHome />} />
<Route element={<ProjectsLayout />}>
<Route path=":pid" element={<Project />} />
<Route path=":pid/edit" element={<EditProject />} />
</Route>
</Route>
</Routes>
インデックスルートは、親のURLで親の<Outlet/>
にレンダリングされます(デフォルトの子ルートのようなもの)。 `index`プロパティで設定します。
<Routes>
<Route path="/" element={<Root />}>
{/* renders into the outlet in <Root> at "/" */}
<Route index element={<Home />} />
<Route path="dashboard" element={<Dashboard />}>
{/* renders into the outlet in <Dashboard> at "/dashboard" */}
<Route index element={<DashboardHome />} />
<Route path="settings" element={<Settings />} />
</Route>
</Route>
</Routes>
インデックスルートには子を持たせることができないことに注意してください。そのような動作を期待している場合は、おそらくレイアウトルートが必要でしょう。
element
プロパティのない<Route path>
は、親レイアウトを導入することなく、子ルートにパスプレフィックスを追加します。
<Route path="projects">
<Route index element={<ProjectsHome />} />
<Route element={<ProjectsLayout />}>
<Route path=":pid" element={<Project />} />
<Route path=":pid/edit" element={<EditProject />} />
</Route>
</Route>
パスセグメントが:
で始まる場合、「動的セグメント」になります。ルートがURLと一致すると、動的セグメントはURLから解析され、useParams
などの他のルーターAPIにparams
として提供されます。
<Route path="teams/:teamId" element={<Team />} />
import { useParams } from "react-router";
export default function Team() {
let params = useParams();
// params.teamId
}
1つのルートパスに複数の動的セグメントを含めることができます。
<Route
path="/c/:categoryId/p/:productId"
element={<Product />}
/>
import { useParams } from "react-router";
export default function Team() {
let { categoryId, productId } = useParams();
// ...
}
セグメントの最後に?
を追加することで、ルートセグメントをオプションにすることができます。
<Route path=":lang?/categories" element={<Categories />} />
静的なセグメントもオプションにすることができます。
<Route path="users/:userId/edit?" component={<User />} />
「キャッチオール」や「スター」セグメントとも呼ばれます。ルートパスパターンが/*
で終わる場合、/
の後の任意の文字(他の/
文字を含む)と一致します。
<Route path="files/*" element={<File />} />
let params = useParams();
// params["*"] will contain the remaining URL after files/
let filePath = params["*"];
*
をデストラクチャリングできます。新しい名前を割り当てるだけです。一般的な名前はsplat
です。
let { "*": splat } = useParams();
Link
とNavLink
を使用して、UIからルートにリンクします。
import { NavLink, Link } from "react-router";
function Header() {
return (
<nav>
{/* NavLink makes it easy to show active states */}
<NavLink
to="/"
className={({ isActive }) =>
isActive ? "active" : ""
}
>
Home
</NavLink>
<Link to="/concerts/salt-lake-city">Concerts</Link>
</nav>
);
}