Raziščite bistvene navigacijske vzorce z React Router v6. Spoznajte deklarativno usmerjanje, dinamične poti, programsko navigacijo, ugnezdene poti in strategije nalaganja podatkov za izdelavo robustnih in uporabniku prijaznih spletnih aplikacij.
React Router v6: Obvladovanje navigacijskih vzorcev za sodobne spletne aplikacije
React Router v6 je zmogljiva in prilagodljiva knjižnica za usmerjanje v React aplikacijah. Omogoča vam ustvarjanje enostranskih aplikacij (SPA) z brezhibno uporabniško izkušnjo, saj upravlja navigacijo brez ponovnega nalaganja celotne strani. Ta objava se bo poglobila v bistvene navigacijske vzorce z uporabo React Router v6 in vam ponudila znanje ter primere za izdelavo robustnih in uporabniku prijaznih spletnih aplikacij.
Razumevanje osrednjih konceptov React Router v6
Preden se poglobimo v specifične vzorce, si oglejmo nekaj temeljnih konceptov:
- Deklarativno usmerjanje: React Router uporablja deklarativni pristop, kjer svoje poti definirate kot React komponente. To naredi vašo logiko usmerjanja jasno in enostavno za vzdrževanje.
- Komponente: Osrednje komponente vključujejo
BrowserRouter
,HashRouter
,MemoryRouter
,Routes
inRoute
. - Hooki (kavlji): React Router ponuja hooke, kot so
useNavigate
,useLocation
,useParams
inuseRoutes
, za dostop do informacij o usmerjanju in upravljanje navigacije.
1. Deklarativno usmerjanje z <Routes>
in <Route>
Temelj React Router v6 je deklarativno usmerjanje. Svoje poti definirate z uporabo komponent <Routes>
in <Route>
. Komponenta <Routes>
deluje kot vsebnik za vaše poti, komponenta <Route>
pa definira specifično pot in komponento, ki se prikaže, ko se ta pot ujema s trenutnim URL-jem.
Primer: Osnovna konfiguracija poti
Tu je osnovni primer nastavitve poti za preprosto aplikacijo:
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 tem primeru definiramo tri poti:
/
: Prikaže komponentoHome
./about
: Prikaže komponentoAbout
./contact
: Prikaže komponentoContact
.
Komponenta BrowserRouter
omogoča usmerjanje, ki temelji na zgodovini brskalnika. React Router primerja trenutni URL z definiranimi potmi in prikaže ustrezno komponento.
2. Dinamične poti z URL parametri
Dinamične poti vam omogočajo ustvarjanje poti, ki lahko obravnavajo različne vrednosti v URL-ju. To je uporabno za prikazovanje vsebine na podlagi edinstvenega identifikatorja, kot je ID izdelka ali ID uporabnika. React Router v6 uporablja simbol :
, da definira URL parametre.
Primer: Prikaz podrobnosti o izdelku
Recimo, da imate spletno trgovino in želite prikazati podrobnosti za vsak izdelek na podlagi njegovega ID-ja. Dinamično pot lahko definirate takole:
import { BrowserRouter, Routes, Route, useParams } from "react-router-dom";
function ProductDetails() {
const { productId } = useParams();
// Pridobi podrobnosti o izdelku na podlagi productId
// ...
return (
Product Details
Product ID: {productId}
{/* Tu prikaži podrobnosti o izdelku */}
);
}
function App() {
return (
} />
);
}
export default App;
V tem primeru:
/products/:productId
definira dinamično pot, kjer je:productId
URL parameter.- Hook
useParams
se uporablja za dostop do vrednosti parametraproductId
znotraj komponenteProductDetails
. - Nato lahko uporabite
productId
za pridobivanje ustreznih podrobnosti o izdelku iz vašega vira podatkov.
Primer internacionalizacije: Obravnava jezikovnih kod
Za večjezično spletno stran lahko uporabite dinamično pot za obravnavo jezikovnih kod:
} />
Ta pot bi se ujemala z URL-ji, kot so /en/about
, /fr/about
in /es/about
. Parameter lang
se lahko nato uporabi za nalaganje ustreznih jezikovnih virov.
3. Programska navigacija z useNavigate
Medtem ko je deklarativno usmerjanje odlično za statične povezave, pogosto potrebujete programsko navigacijo na podlagi uporabniških dejanj ali logike aplikacije. React Router v6 za ta namen ponuja hook useNavigate
. useNavigate
vrne funkcijo, ki vam omogoča navigacijo na različne poti.
Primer: Preusmeritev po oddaji obrazca
Recimo, da imate oddajo obrazca in želite uporabnika po uspešni oddaji preusmeriti na stran o uspehu:
import { useNavigate } from "react-router-dom";
function MyForm() {
const navigate = useNavigate();
const handleSubmit = async (event) => {
event.preventDefault();
// Pošlji podatke obrazca
// ...
// Po uspešni oddaji preusmeri na stran o uspehu
navigate("/success");
};
return (
);
}
export default MyForm;
V tem primeru:
- Uporabimo hook
useNavigate
, da dobimo funkcijonavigate
. - Po uspešni oddaji obrazca pokličemo
navigate("/success")
, da uporabnika preusmerimo na pot/success
.
Prenos stanja med navigacijo
Stanje lahko prenesete tudi skupaj z navigacijo z uporabo drugega argumenta funkcije navigate
:
navigate("/confirmation", { state: { orderId: "12345" } });
To vam omogoča prenos podatkov ciljni komponenti, do katerih lahko dostopate z uporabo hooka useLocation
.
4. Ugnezdene poti in postavitve
Ugnezdene poti vam omogočajo ustvarjanje hierarhičnih struktur usmerjanja, kjer je ena pot ugnezdena znotraj druge. To je uporabno za organiziranje kompleksnih aplikacij z več nivoji navigacije. To pomaga pri ustvarjanju postavitev, kjer so določeni elementi uporabniškega vmesnika dosledno prisotni v celotnem delu aplikacije.
Primer: Odsek uporabniškega profila
Recimo, da imate odsek uporabniškega profila z ugnezdenimi potmi za prikaz informacij o profilu uporabnika, nastavitev in naročil:
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";
function Profile() {
return (
Uporabniški profil
-
Informacije o profilu
-
Nastavitve
-
Naročila
} />
} />
} />
);
}
function ProfileInformation() {
return Komponenta z informacijami o profilu
;
}
function Settings() {
return Komponenta z nastavitvami
;
}
function Orders() {
return Komponenta z naročili
;
}
function App() {
return (
} />
);
}
export default App;
V tem primeru:
- Pot
/profile/*
se ujema z vsakim URL-jem, ki se začne s/profile
. - Komponenta
Profile
prikaže navigacijski meni in komponento<Routes>
za obravnavo ugnezdenih poti. - Ugnezdene poti definirajo komponente, ki se prikažejo za
/profile/info
,/profile/settings
in/profile/orders
.
Znak *
v nadrejeni poti je ključen; označuje, da se mora nadrejena pot ujemati s katero koli pod-potjo, kar omogoča pravilno ujemanje ugnezdenih poti znotraj komponente Profile
.
5. Obravnava napak "Stran ni najdena" (404)
Bistveno je obravnavati primere, ko uporabnik navigira na pot, ki ne obstaja. React Router v6 to poenostavi s potjo, ki zajame vse ostale primere ("catch-all").
Primer: Implementacija strani 404
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";
function NotFound() {
return (
404 - Stran ni najdena
Stran, ki jo iščete, ne obstaja.
Pojdi nazaj na domačo stran
);
}
function App() {
return (
} />
} />
} />
);
}
V tem primeru:
- Pot
<Route path="*" element={<NotFound />} />
je "catch-all" pot, ki se ujema z vsakim URL-jem, ki se ne ujema z nobeno od drugih definiranih poti. - Pomembno je, da to pot postavite na konec komponente
<Routes>
, tako da se ujema le, če se nobena druga pot ne ujema.
6. Strategije nalaganja podatkov z React Router v6
React Router v6 ne vključuje vgrajenih mehanizmov za nalaganje podatkov, kot jih je imel njegov predhodnik (React Router v5 z `useRouteMatch`). Vendar pa ponuja orodja za učinkovito implementacijo različnih strategij nalaganja podatkov.
Možnost 1: Pridobivanje podatkov v komponentah
Najenostavnejši pristop je pridobivanje podatkov neposredno znotraj komponente, ki prikazuje pot. Uporabite lahko hook useEffect
za pridobivanje podatkov, ko se komponenta naloži ali ko se spremenijo URL parametri.
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 Nalaganje...
;
if (error) return Napaka: {error.message}
;
if (!product) return Izdelek ni najden
;
return (
{product.name}
{product.description}
);
}
export default ProductDetails;
Ta pristop je preprost, vendar lahko vodi do podvajanja kode, če morate podatke pridobivati v več komponentah. Prav tako je manj učinkovit, ker se pridobivanje podatkov začne šele po tem, ko je komponenta naložena.
Možnost 2: Uporaba prilagojenega hooka za pridobivanje podatkov
Za zmanjšanje podvajanja kode lahko ustvarite prilagojen hook, ki zajema logiko pridobivanja podatkov. Ta hook se lahko nato ponovno uporabi v več komponentah.
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;
Nato lahko ta hook uporabite v svojih komponentah:
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 Nalaganje...
;
if (error) return Napaka: {error.message}
;
if (!product) return Izdelek ni najden
;
return (
{product.name}
{product.description}
);
}
export default ProductDetails;
Možnost 3: Uporaba knjižnice za usmerjanje z zmožnostmi pridobivanja podatkov (TanStack Router, Remix)
Knjižnice, kot sta TanStack Router in Remix, ponujajo vgrajene mehanizme za pridobivanje podatkov, ki se brezhibno integrirajo z usmerjanjem. Te knjižnice pogosto ponujajo funkcije, kot so:
- Nalaganje (Loaders): Funkcije, ki se izvedejo *preden* se pot prikaže, kar vam omogoča, da pridobite podatke in jih posredujete komponenti.
- Dejanja (Actions): Funkcije, ki obravnavajo oddaje obrazcev in mutacije podatkov.
Uporaba takšne knjižnice lahko drastično poenostavi nalaganje podatkov in izboljša delovanje, zlasti pri kompleksnih aplikacijah.
Prikazovanje na strežniški strani (SSR) in generiranje statičnih strani (SSG)
Za izboljšano SEO in začetno zmogljivost nalaganja razmislite o uporabi SSR ali SSG z ogrodji, kot sta Next.js ali Gatsby. Ta ogrodja vam omogočajo pridobivanje podatkov na strežniku ali med postopkom gradnje in streženje vnaprej prikazanega HTML-ja odjemalcu. To odpravlja potrebo, da bi odjemalec pridobival podatke ob začetnem nalaganju, kar vodi do hitrejše in bolj SEO prijazne izkušnje.
7. Delo z različnimi tipi usmerjevalnikov
React Router v6 ponuja različne implementacije usmerjevalnikov, ki ustrezajo različnim okoljem in primerom uporabe:
- BrowserRouter: Uporablja HTML5 history API (
pushState
,replaceState
) za navigacijo. To je najpogostejša izbira za spletne aplikacije, ki se izvajajo v brskalniškem okolju. - HashRouter: Uporablja del URL-ja z lojtro (
#
) za navigacijo. To je uporabno za aplikacije, ki morajo podpirati starejše brskalnike ali so nameščene na strežnikih, ki ne podpirajo HTML5 history API. - MemoryRouter: Hrani zgodovino vašega "URL-ja" v pomnilniku (polje URL-jev). Uporabno v okoljih, kot sta React Native in testiranje.
Izberite tip usmerjevalnika, ki najbolje ustreza zahtevam in okolju vaše aplikacije.
Zaključek
React Router v6 ponuja celovito in prilagodljivo rešitev za usmerjanje v React aplikacijah. Z razumevanjem in uporabo navigacijskih vzorcev, obravnavanih v tej objavi, lahko gradite robustne, uporabniku prijazne in vzdrževane spletne aplikacije. Od deklarativnega usmerjanja z <Routes>
in <Route>
do dinamičnih poti z URL parametri, programske navigacije z useNavigate
in učinkovitih strategij nalaganja podatkov, vam React Router v6 omogoča ustvarjanje brezhibnih navigacijskih izkušenj za vaše uporabnike. Razmislite o raziskovanju naprednejših knjižnic za usmerjanje in ogrodij SSR/SSG za še večji nadzor in optimizacijo delovanja. Ne pozabite prilagoditi teh vzorcev specifičnim zahtevam vaše aplikacije in vedno dajte prednost jasni in intuitivni uporabniški izkušnji.