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,RoutesaRoute. - Hooky: React Router poskytuje hooky ako
useNavigate,useLocation,useParamsauseRoutesna 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/:productIddefinuje dynamickú cestu, kde:productIdje URL parameter.- Hook
useParamssa používa na prístup k hodnote parametraproductIdv rámci komponentuProductDetails. - Potom môžete použiť
productIdna 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
useNavigatena 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
Profilevykresľuje navigačné menu a komponent<Routes>na spracovanie vnorených ciest. - Vnorené cesty definujú komponenty, ktoré sa majú vykresliť pre
/profile/info,/profile/settingsa/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.