Hrvatski

Istražite ključne navigacijske obrasce s React Router v6. Naučite deklarativno i dinamičko usmjeravanje, programatsku navigaciju i strategije učitavanja podataka.

React Router v6: Ovladavanje navigacijskim obrascima za moderne web aplikacije

React Router v6 je moćna i fleksibilna biblioteka za usmjeravanje u React aplikacijama. Omogućuje vam stvaranje single-page aplikacija (SPA) s besprijekornim korisničkim iskustvom upravljanjem navigacijom bez potpunog ponovnog učitavanja stranice. Ovaj blog post će se detaljno baviti ključnim navigacijskim obrascima koristeći React Router v6, pružajući vam znanje i primjere za izradu robusnih i korisnički prihvatljivih web aplikacija.

Razumijevanje osnovnih koncepata React Routera v6

Prije nego što se upustimo u specifične obrasce, pregledajmo neke temeljne koncepte:

1. Deklarativno usmjeravanje s <Routes> i <Route>

Temelj React Routera v6 leži u deklarativnom usmjeravanju. Svoje rute definirate pomoću komponenata <Routes> i <Route>. Komponenta <Routes> djeluje kao spremnik za vaše rute, a komponenta <Route> definira određenu rutu i komponentu koja će se prikazati kada ta ruta odgovara trenutnom URL-u.

Primjer: Osnovna konfiguracija ruta

Ovdje je osnovni primjer postavljanja ruta za jednostavnu aplikaciju:


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;

U ovom primjeru definiramo tri rute:

Komponenta BrowserRouter omogućuje usmjeravanje temeljeno na povijesti preglednika. React Router uspoređuje trenutni URL s definiranim rutama i prikazuje odgovarajuću komponentu.

2. Dinamičke rute s URL parametrima

Dinamičke rute omogućuju vam stvaranje ruta koje mogu rukovati različitim vrijednostima u URL-u. Ovo je korisno za prikazivanje sadržaja na temelju jedinstvenog identifikatora, kao što je ID proizvoda ili ID korisnika. React Router v6 koristi simbol : za definiranje URL parametara.

Primjer: Prikazivanje detalja proizvoda

Recimo da imate aplikaciju za e-trgovinu i želite prikazati detalje za svaki proizvod na temelju njegovog ID-a. Možete definirati dinamičku rutu poput ove:


import { BrowserRouter, Routes, Route, useParams } from "react-router-dom";

function ProductDetails() {
  const { productId } = useParams();

  // Dohvati detalje proizvoda na temelju productId
  // ...

  return (
    

Detalji proizvoda

ID proizvoda: {productId}

{/* Ovdje prikažite detalje proizvoda */}
); } function App() { return ( } /> ); } export default App;

U ovom primjeru:

Primjer internacionalizacije: Rukovanje jezičnim kodovima

Za višejezičnu web stranicu, mogli biste koristiti dinamičku rutu za rukovanje jezičnim kodovima:


} />

Ova ruta bi odgovarala URL-ovima poput /en/about, /hr/about i /de/about. Parametar lang se tada može koristiti za učitavanje odgovarajućih jezičnih resursa.

3. Programatska navigacija s useNavigate

Iako je deklarativno usmjeravanje izvrsno za statičke poveznice, često je potrebno programatski navigirati na temelju korisničkih radnji ili logike aplikacije. React Router v6 za tu svrhu pruža hook useNavigate. useNavigate vraća funkciju koja vam omogućuje navigaciju na različite rute.

Primjer: Preusmjeravanje nakon slanja obrasca

Recimo da imate slanje obrasca i želite preusmjeriti korisnika na stranicu s porukom o uspjehu nakon što je obrazac uspješno poslan:


import { useNavigate } from "react-router-dom";

function MyForm() {
  const navigate = useNavigate();

  const handleSubmit = async (event) => {
    event.preventDefault();

    // Pošalji podatke obrasca
    // ...

    // Preusmjeri na stranicu uspjeha nakon uspješnog slanja
    navigate("/success");
  };

  return (
    
{/* Polja obrasca */}
); } export default MyForm;

U ovom primjeru:

Prijenos stanja (state) tijekom navigacije

Također možete proslijediti stanje (state) zajedno s navigacijom koristeći drugi argument funkcije navigate:


navigate("/confirmation", { state: { orderId: "12345" } });

To vam omogućuje prijenos podataka ciljnoj komponenti, kojima se može pristupiti pomoću hooka useLocation.

4. Ugniježđene rute i rasporedi (Layouts)

Ugniježđene rute omogućuju vam stvaranje hijerarhijskih struktura usmjeravanja, gdje je jedna ruta ugniježđena unutar druge. Ovo je korisno za organiziranje složenih aplikacija s više razina navigacije. To pomaže u stvaranju rasporeda (layouta) gdje su određeni elementi korisničkog sučelja dosljedno prisutni u cijelom dijelu aplikacije.

Primjer: Odjeljak korisničkog profila

Recimo da imate odjeljak korisničkog profila s ugniježđenim rutama za prikaz informacija o profilu korisnika, postavkama i narudžbama:


import { BrowserRouter, Routes, Route, Link } from "react-router-dom";

function Profile() {
  return (
    

Korisnički profil

  • Informacije o profilu
  • Postavke
  • Narudžbe
} /> } /> } />
); } function ProfileInformation() { return

Komponenta s informacijama o profilu

; } function Settings() { return

Komponenta s postavkama

; } function Orders() { return

Komponenta s narudžbama

; } function App() { return ( } /> ); } export default App;

U ovom primjeru:

Znak * u roditeljskoj ruti je ključan; označava da bi roditeljska ruta trebala odgovarati bilo kojoj pod-putanji, omogućujući ispravno podudaranje ugniježđenih ruta unutar komponente Profile.

5. Rukovanje pogreškama "Nije pronađeno" (404)

Bitno je rukovati slučajevima kada korisnik dođe na rutu koja ne postoji. React Router v6 to olakšava pomoću "catch-all" (sveobuhvatne) rute.

Primjer: Implementacija 404 stranice


import { BrowserRouter, Routes, Route, Link } from "react-router-dom";

function NotFound() {
  return (
    

404 - Nije pronađeno

Stranica koju tražite ne postoji.

Vrati se na početnu stranicu
); } function App() { return ( } /> } /> } /> ); }

U ovom primjeru:

6. Strategije učitavanja podataka s React Router v6

React Router v6 ne uključuje ugrađene mehanizme za učitavanje podataka kao njegov prethodnik (React Router v5 s `useRouteMatch`). Međutim, pruža alate za učinkovitu implementaciju različitih strategija učitavanja podataka.

Opcija 1: Dohvaćanje podataka u komponentama

Najjednostavniji pristup je dohvaćanje podataka izravno unutar komponente koja prikazuje rutu. Možete koristiti useEffect hook za dohvaćanje podataka kada se komponenta montira ili kada se promijene 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 pogreška! status: ${response.status}`);
        }
        const data = await response.json();
        setProduct(data);
        setLoading(false);
      } catch (e) {
        setError(e);
        setLoading(false);
      }
    }

    fetchProduct();
  }, [productId]);

  if (loading) return 

Učitavanje...

; if (error) return

Greška: {error.message}

; if (!product) return

Proizvod nije pronađen

; return (

{product.name}

{product.description}

); } export default ProductDetails;

Ovaj pristup je jednostavan, ali može dovesti do dupliciranja koda ako trebate dohvaćati podatke u više komponenata. Također je manje učinkovit jer dohvaćanje podataka započinje tek nakon što je komponenta montirana.

Opcija 2: Korištenje prilagođenog hooka za dohvaćanje podataka

Da biste smanjili dupliciranje koda, možete stvoriti prilagođeni hook koji enkapsulira logiku dohvaćanja podataka. Ovaj hook se zatim može ponovno koristiti u više komponenata.


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 pogreška! 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;

Zatim, možete koristiti ovaj hook u svojim komponentama:


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 

Učitavanje...

; if (error) return

Greška: {error.message}

; if (!product) return

Proizvod nije pronađen

; return (

{product.name}

{product.description}

); } export default ProductDetails;

Opcija 3: Korištenje biblioteke za usmjeravanje s mogućnostima dohvaćanja podataka (TanStack Router, Remix)

Biblioteke poput TanStack Router i Remix nude ugrađene mehanizme za dohvaćanje podataka koji se besprijekorno integriraju s usmjeravanjem. Ove biblioteke često pružaju značajke kao što su:

Korištenje takve biblioteke može drastično pojednostaviti učitavanje podataka i poboljšati performanse, posebno za složene aplikacije.

Renderiranje na strani poslužitelja (SSR) i Generiranje statičkih stranica (SSG)

Za poboljšani SEO i početne performanse učitavanja, razmislite o korištenju SSR-a ili SSG-a s okvirima poput Next.js ili Gatsby. Ovi okviri omogućuju vam dohvaćanje podataka na poslužitelju ili tijekom vremena izrade i posluživanje unaprijed renderiranog HTML-a klijentu. To eliminira potrebu da klijent dohvaća podatke pri početnom učitavanju, što rezultira bržim i SEO-prijateljskijim iskustvom.

7. Rad s različitim vrstama Routera

React Router v6 pruža različite implementacije routera koje odgovaraju različitim okruženjima i slučajevima upotrebe:

Odaberite vrstu routera koja najbolje odgovara zahtjevima i okruženju vaše aplikacije.

Zaključak

React Router v6 pruža sveobuhvatno i fleksibilno rješenje za usmjeravanje u React aplikacijama. Razumijevanjem i primjenom navigacijskih obrazaca o kojima smo raspravljali u ovom blog postu, možete izraditi robusne, korisnički prihvatljive i održive web aplikacije. Od deklarativnog usmjeravanja s <Routes> i <Route> do dinamičkih ruta s URL parametrima, programatske navigacije s useNavigate i učinkovitih strategija za učitavanje podataka, React Router v6 vam omogućuje stvaranje besprijekornih navigacijskih iskustava za vaše korisnike. Razmislite o istraživanju naprednih biblioteka za usmjeravanje i SSR/SSG okvira za još veću kontrolu i optimizaciju performansi. Ne zaboravite prilagoditi ove obrasce specifičnim zahtjevima vaše aplikacije i uvijek dajte prednost jasnom i intuitivnom korisničkom iskustvu.