client-seitiges Routing: Navigieren zwischen verschiedenen Ansichten, ohne die React-Anwendung zu verlassen
Optionen:
hash-basiertes Client-seitiges Routing, z.B.:
example.com/#/home
example.com/#/shop/cart
Client-seitiges Routing basierend auf dem History API, z.B.:
example.com/home
example.com/shop/cart
Für die zweite Option muss der Server zusätzlich konfiguriert werden
npm-Paket: react-router-dom
Die ganze Anwendung wird in ein BrowserRouter
-Element eingebettet:
// index.tsx
import { BrowserRouter } from 'react-router-dom';
ReactDOM.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>,
rootElement
);
<Route>
- rendert ihre Inhalte, wenn sie aktiv ist<Routes>
- Container für <Route>
-Elemente<Link>
/ <NavLink>
- werden anstatt von <a>
-Elementen verwendetfunction App() {
return (
<div>
<NavLink to="/">home</NavLink>{' '}
<NavLink to="/about">about</NavLink>
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/about" element={<AboutPage />} />
<Route path="*" element={<NotFoundPage />} />
</Routes>
</div>
);
}
function App() {
return (
<Routes>
<Route path="/" element={<HomeView />} />
<Route path="/about" element={<AboutView />} />
<Route path="/shop" element={<ShopView />}>
<Route index={true} element={<ShopIndex />} />
<Route path="/products" element={<Products />} />
<Route path="/cart" element={<Cart />} />
</Route>
</Routes>
);
}
Der Output einer Unteroute wird im <Outlet>
der Elternroute angezeigt:
function ShopView() {
return (
<div>
<h1>Shop</h1>
<NavLink to="/shop">shop index</NavLink>
<NavLink to="/shop/products">products</NavLink>
<NavLink to="/shop/cart">cart</NavLink>
<Outlet />
</div>
);
}
<Route
path="/products/:productId"
element={<ProductDetails />}
/>
function ProductDetails() {
const { productId } = useParams();
// ...
}
const navigate = useNavigate();
// ...
navigate('/');
Einen aktiven Link anders darstellen:
<NavLink
to="/about"
className={(arg) =>
arg.isActive ? 'NavLink--Active' : undefined
}
>
...
</NavLink>
Erstellen einer wiederverwendbaren Komponente:
function MyNavLink(
props: ComponentPropsWithoutRef<typeof NavLink>
) {
return (
<NavLink
{...props}
className={(arg) =>
arg.isActive ? 'NavLink NavLink--Active' : 'NavLink'
}
/>
);
}
erstelle Routen in der Todo-Anwendung, z.B.:
/
/about
/add
/stats