Preskúmajte základné navigačné vzory s React Router v6. Naučte sa deklaratívne smerovanie, dynamické cesty, programovú navigáciu, vnorené cesty a stratégie načítavania dát na tvorbu robustných a používateľsky prívetivých webových aplikácií.
React Router v6: Zvládnutie navigačných vzorov pre moderné webové aplikácie
React Router v6 je výkonná a flexibilná knižnica na smerovanie (routing) pre React aplikácie. Umožňuje vytvárať jednostránkové aplikácie (SPA) s plynulým používateľským zážitkom tým, že spravuje navigáciu bez nutnosti znova načítať celú stránku. Tento blogový príspevok sa ponorí do základných navigačných vzorov s použitím React Router v6 a poskytne vám vedomosti a príklady na tvorbu robustných a používateľsky prívetivých webových aplikácií.
Pochopenie základných konceptov React Router v6
Predtým, ako sa ponoríme do špecifických vzorov, zopakujme si niekoľko základných konceptov:
- Deklaratívne smerovanie: React Router používa deklaratívny prístup, kde definujete svoje cesty ako React komponenty. Vďaka tomu je vaša logika smerovania jasná a udržiavateľná.
- Komponenty: Medzi základné komponenty patria
BrowserRouter
,HashRouter
,MemoryRouter
,Routes
aRoute
. - Hooky: React Router poskytuje hooky ako
useNavigate
,useLocation
,useParams
auseRoutes
na prístup k informáciám o smerovaní a na manipuláciu s navigáciou.
1. Deklaratívne smerovanie s <Routes>
a <Route>
Základom React Router v6 je deklaratívne smerovanie. Cesty definujete pomocou komponentov <Routes>
a <Route>
. Komponent <Routes>
slúži ako kontajner pre vaše cesty a komponent <Route>
definuje špecifickú cestu a komponent, ktorý sa má vykresliť, keď sa daná cesta zhoduje s aktuálnou URL.
Príklad: Základná konfigurácia ciest
Tu je základný príklad nastavenia ciest pre jednoduchú aplikáciu:
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Home from "./pages/Home";
import About from "./pages/About";
import Contact from "./pages/Contact";
function App() {
return (
} />
} />
} />
);
}
export default App;
V tomto príklade definujeme tri cesty:
/
: Vykreslí komponentHome
./about
: Vykreslí komponentAbout
./contact
: Vykreslí komponentContact
.
Komponent BrowserRouter
umožňuje smerovanie založené na histórii prehliadača. React Router porovná aktuálnu URL s definovanými cestami a vykreslí príslušný komponent.
2. Dynamické cesty s URL parametrami
Dynamické cesty vám umožňujú vytvárať cesty, ktoré dokážu spracovať rôzne hodnoty v URL. Je to užitočné na zobrazovanie obsahu na základe jedinečného identifikátora, ako je ID produktu alebo ID používateľa. React Router v6 používa na definovanie URL parametrov symbol :
.
Príklad: Zobrazenie detailov produktu
Povedzme, že máte e-commerce aplikáciu a chcete zobraziť detaily každého produktu na základe jeho ID. Môžete definovať dynamickú cestu takto:
import { BrowserRouter, Routes, Route, useParams } from "react-router-dom";
function ProductDetails() {
const { productId } = useParams();
// Získanie detailov produktu na základe productId
// ...
return (
Detaily produktu
ID produktu: {productId}
{/* Tu zobrazte detaily produktu */}
);
}
function App() {
return (
} />
);
}
export default App;
V tomto príklade:
/products/:productId
definuje dynamickú cestu, kde:productId
je URL parameter.- Hook
useParams
sa používa na prístup k hodnote parametraproductId
v rámci komponentuProductDetails
. - Potom môžete použiť
productId
na načítanie príslušných detailov produktu z vášho zdroja dát.
Príklad internacionalizácie: Spracovanie kódov jazykov
Pre viacjazyčnú webovú stránku môžete použiť dynamickú cestu na spracovanie kódov jazykov:
} />
Táto cesta by sa zhodovala s URL adresami ako /en/about
, /fr/about
a /es/about
. Parameter lang
sa potom môže použiť na načítanie príslušných jazykových zdrojov.
3. Programová navigácia s useNavigate
Zatiaľ čo deklaratívne smerovanie je skvelé pre statické odkazy, často potrebujete navigovať programovo na základe akcií používateľa alebo logiky aplikácie. React Router v6 na tento účel poskytuje hook useNavigate
. useNavigate
vracia funkciu, ktorá vám umožňuje navigovať na rôzne cesty.
Príklad: Presmerovanie po odoslaní formulára
Povedzme, že máte odoslanie formulára a chcete používateľa po úspešnom odoslaní presmerovať na stránku s potvrdením o úspechu:
import { useNavigate } from "react-router-dom";
function MyForm() {
const navigate = useNavigate();
const handleSubmit = async (event) => {
event.preventDefault();
// Odoslanie dát formulára
// ...
// Presmerovanie na stránku úspechu po úspešnom odoslaní
navigate("/success");
};
return (
);
}
export default MyForm;
V tomto príklade:
- Používame hook
useNavigate
na získanie funkcienavigate
. - Po úspešnom odoslaní formulára voláme
navigate("/success")
, aby sme používateľa presmerovali na cestu/success
.
Odosielanie stavu počas navigácie
Môžete tiež odoslať stav spolu s navigáciou pomocou druhého argumentu funkcie navigate
:
navigate("/confirmation", { state: { orderId: "12345" } });
To vám umožňuje odovzdať dáta cieľovému komponentu, ku ktorým je možné pristupovať pomocou hooku useLocation
.
4. Vnorené cesty a layouty
Vnorené cesty vám umožňujú vytvárať hierarchické štruktúry smerovania, kde je jedna cesta vnorená do druhej. Je to užitočné na organizovanie zložitých aplikácií s viacerými úrovňami navigácie. Pomáha to pri vytváraní layoutov, kde sú určité prvky používateľského rozhrania konzistentne prítomné v celej sekcii aplikácie.
Príklad: Sekcia profilu používateľa
Povedzme, že máte sekciu profilu používateľa s vnorenými cestami na zobrazenie informácií o profile, nastavení a objednávok používateľa:
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";
function Profile() {
return (
Profil používateľa
-
Informácie o profile
-
Nastavenia
-
Objednávky
} />
} />
} />
);
}
function ProfileInformation() {
return Komponent informácií o profile
;
}
function Settings() {
return Komponent nastavení
;
}
function Orders() {
return Komponent objednávok
;
}
function App() {
return (
} />
);
}
export default App;
V tomto príklade:
- Cesta
/profile/*
sa zhoduje s akoukoľvek URL, ktorá začína na/profile
. - Komponent
Profile
vykresľuje navigačné menu a komponent<Routes>
na spracovanie vnorených ciest. - Vnorené cesty definujú komponenty, ktoré sa majú vykresliť pre
/profile/info
,/profile/settings
a/profile/orders
.
Symbol *
v nadradenej ceste je kľúčový; znamená, že nadradená cesta by sa mala zhodovať s akoukoľvek podradenou cestou, čo umožňuje správne priradenie vnorených ciest v rámci komponentu Profile
.
5. Spracovanie chýb "Nenájdené" (404)
Je dôležité ošetriť prípady, kedy používateľ prejde na cestu, ktorá neexistuje. React Router v6 to uľahčuje pomocou zbernej (catch-all) cesty.
Príklad: Implementácia stránky 404
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";
function NotFound() {
return (
404 - Nenájdené
Stránka, ktorú hľadáte, neexistuje.
Návrat na domovskú stránku
);
}
function App() {
return (
} />
} />
} />
);
}
V tomto príklade:
- Cesta
<Route path="*" element={<NotFound />} />
je zberná cesta, ktorá sa zhoduje s akoukoľvek URL, ktorá sa nezhoduje so žiadnou inou definovanou cestou. - Je dôležité umiestniť túto cestu na koniec komponentu
<Routes>
, aby sa priradila iba v prípade, že sa nezhoduje žiadna iná cesta.
6. Stratégie načítavania dát s React Router v6
React Router v6 neobsahuje vstavané mechanizmy na načítavanie dát ako jeho predchodca (React Router v5 s `useRouteMatch`). Poskytuje však nástroje na efektívnu implementáciu rôznych stratégií načítavania dát.
Možnosť 1: Načítavanie dát v komponentoch
Najjednoduchším prístupom je načítať dáta priamo v komponente, ktorý vykresľuje danú cestu. Môžete použiť hook useEffect
na načítanie dát pri pripojení (mount) komponentu alebo pri zmene URL parametrov.
import { useParams } from "react-router-dom";
import { useEffect, useState } from "react";
function ProductDetails() {
const { productId } = useParams();
const [product, setProduct] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
async function fetchProduct() {
try {
const response = await fetch(`/api/products/${productId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setProduct(data);
setLoading(false);
} catch (e) {
setError(e);
setLoading(false);
}
}
fetchProduct();
}, [productId]);
if (loading) return Načítava sa...
;
if (error) return Chyba: {error.message}
;
if (!product) return Produkt sa nenašiel
;
return (
{product.name}
{product.description}
);
}
export default ProductDetails;
Tento prístup je priamočiary, ale môže viesť k duplicite kódu, ak potrebujete načítavať dáta vo viacerých komponentoch. Je tiež menej efektívny, pretože načítavanie dát sa začne až po pripojení (mount) komponentu.
Možnosť 2: Použitie vlastného hooku na načítavanie dát
Na zníženie duplicity kódu môžete vytvoriť vlastný hook, ktorý zapuzdrí logiku načítavania dát. Tento hook potom môžete opakovane použiť vo viacerých komponentoch.
import { useState, useEffect } from "react";
function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
async function fetchData() {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const json = await response.json();
setData(json);
setLoading(false);
} catch (e) {
setError(e);
setLoading(false);
}
}
fetchData();
}, [url]);
return { data, loading, error };
}
export default useFetch;
Potom môžete tento hook použiť vo svojich komponentoch:
import { useParams } from "react-router-dom";
import useFetch from "./useFetch";
function ProductDetails() {
const { productId } = useParams();
const { data: product, loading, error } = useFetch(`/api/products/${productId}`);
if (loading) return Načítava sa...
;
if (error) return Chyba: {error.message}
;
if (!product) return Produkt sa nenašiel
;
return (
{product.name}
{product.description}
);
}
export default ProductDetails;
Možnosť 3: Použitie knižnice na smerovanie s funkciami na načítavanie dát (TanStack Router, Remix)
Knižnice ako TanStack Router a Remix ponúkajú vstavané mechanizmy na načítavanie dát, ktoré sa bezproblémovo integrujú so smerovaním. Tieto knižnice často poskytujú funkcie ako:
- Loadery: Funkcie, ktoré sa vykonajú *pred* vykreslením cesty, čo vám umožní načítať dáta a odovzdať ich komponentu.
- Akcie: Funkcie, ktoré spracúvajú odosielanie formulárov a mutácie dát.
Použitie takejto knižnice môže drasticky zjednodušiť načítavanie dát a zlepšiť výkon, najmä pri zložitých aplikáciách.
Vykresľovanie na strane servera (SSR) a generovanie statických stránok (SSG)
Pre lepšie SEO a výkon pri prvom načítaní zvážte použitie SSR alebo SSG s frameworkami ako Next.js alebo Gatsby. Tieto frameworky vám umožňujú načítať dáta na serveri alebo počas procesu zostavovania (build time) a doručiť klientovi vopred vykreslené HTML. Tým sa eliminuje potreba klienta načítavať dáta pri prvom načítaní, čo vedie k rýchlejšiemu a pre SEO priaznivejšiemu zážitku.
7. Práca s rôznymi typmi smerovačov (Router)
React Router v6 poskytuje rôzne implementácie smerovačov, aby vyhovovali rôznym prostrediam a prípadom použitia:
- BrowserRouter: Používa HTML5 history API (
pushState
,replaceState
) na navigáciu. Je to najbežnejšia voľba pre webové aplikácie bežiace v prostredí prehliadača. - HashRouter: Používa hašovaciu časť URL (
#
) na navigáciu. Je to užitočné pre aplikácie, ktoré potrebujú podporovať staršie prehliadače alebo sú nasadené na serveroch, ktoré nepodporujú HTML5 history API. - MemoryRouter: Udržiava históriu vašej "URL" v pamäti (pole URL adries). Je to užitočné v prostrediach ako React Native a pri testovaní.
Vyberte si typ smerovača, ktorý najlepšie vyhovuje požiadavkám a prostrediu vašej aplikácie.
Záver
React Router v6 poskytuje komplexné a flexibilné riešenie smerovania pre React aplikácie. Porozumením a aplikovaním navigačných vzorov diskutovaných v tomto blogovom príspevku môžete vytvárať robustné, používateľsky prívetivé a udržiavateľné webové aplikácie. Od deklaratívneho smerovania s <Routes>
a <Route>
, cez dynamické cesty s URL parametrami, programovú navigáciu s useNavigate
, až po efektívne stratégie načítavania dát, React Router v6 vám umožňuje vytvárať plynulé navigačné zážitky pre vašich používateľov. Zvážte preskúmanie pokročilých knižníc na smerovanie a SSR/SSG frameworkov pre ešte väčšiu kontrolu a optimalizáciu výkonu. Nezabudnite prispôsobiť tieto vzory špecifickým požiadavkám vašej aplikácie a vždy uprednostňujte jasný a intuitívny používateľský zážitok.