Română

Explorați modele esențiale de navigare cu React Router v6. Învățați rutarea declarativă, rutele dinamice, navigarea programatică, rutele imbricate și strategiile de încărcare a datelor pentru a construi aplicații web robuste și prietenoase cu utilizatorul.

React Router v6: Stăpânirea Modelelor de Navigare pentru Aplicații Web Moderne

React Router v6 este o bibliotecă de rutare puternică și flexibilă pentru aplicațiile React. Vă permite să creați aplicații de tip single-page (SPA) cu o experiență de utilizare fluidă, gestionând navigarea fără reîncărcări complete ale paginii. Acest articol de blog va aprofunda modelele esențiale de navigare folosind React Router v6, oferindu-vă cunoștințele și exemplele necesare pentru a construi aplicații web robuste și prietenoase cu utilizatorul.

Înțelegerea Conceptelor de Bază ale React Router v6

Înainte de a aprofunda modele specifice, să trecem în revistă câteva concepte fundamentale:

1. Rutare Declarativă cu <Routes> și <Route>

Fundația React Router v6 constă în rutarea declarativă. Vă definiți rutele folosind componentele <Routes> și <Route>. Componenta <Routes> acționează ca un container pentru rutele dvs., iar componenta <Route> definește o rută specifică și componenta de redat atunci când acea rută se potrivește cu URL-ul curent.

Exemplu: Configurare de Bază a Rutelor

Iată un exemplu de bază pentru configurarea rutelor pentru o aplicație simplă:


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;

În acest exemplu, definim trei rute:

Componenta BrowserRouter permite rutarea bazată pe istoricul browserului. React Router potrivește URL-ul curent cu rutele definite și randează componenta corespunzătoare.

2. Rute Dinamice cu Parametri URL

Rutele dinamice vă permit să creați rute care pot gestiona valori diferite în URL. Acest lucru este util pentru afișarea conținutului pe baza unui identificator unic, cum ar fi un ID de produs sau un ID de utilizator. React Router v6 folosește simbolul : pentru a defini parametrii URL.

Exemplu: Afișarea Detaliilor Produsului

Să presupunem că aveți o aplicație de comerț electronic și doriți să afișați detalii pentru fiecare produs pe baza ID-ului său. Puteți defini o rută dinamică astfel:


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

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

  // Preluare detalii produs pe baza productId
  // ...

  return (
    

Product Details

Product ID: {productId}

{/* Afișare detalii produs aici */}
); } function App() { return ( } /> ); } export default App;

În acest exemplu:

Exemplu de Internaționalizare: Gestionarea Codurilor de Limbă

Pentru un site multilingv, ați putea folosi o rută dinamică pentru a gestiona codurile de limbă:


} />

Această rută s-ar potrivi cu URL-uri precum /en/about, /fr/about și /es/about. Parametrul lang poate fi apoi folosit pentru a încărca resursele de limbă corespunzătoare.

3. Navigare Programatică cu useNavigate

Deși rutarea declarativă este excelentă pentru linkuri statice, adesea este necesar să navigați programatic pe baza acțiunilor utilizatorului sau a logicii aplicației. React Router v6 oferă hook-ul useNavigate în acest scop. useNavigate returnează o funcție care vă permite să navigați către diferite rute.

Exemplu: Redirecționarea după Trimiterea unui Formular

Să presupunem că aveți un formular și doriți să redirecționați utilizatorul către o pagină de succes după ce formularul este trimis cu succes:


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

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

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

    // Trimiterea datelor formularului
    // ...

    // Redirecționare către pagina de succes după trimiterea cu succes
    navigate("/success");
  };

  return (
    
{/* Câmpuri de formular */}
); } export default MyForm;

În acest exemplu:

Trimiterea de Stare (State) în Timpul Navigării

Puteți, de asemenea, să transmiteți o stare (state) odată cu navigarea folosind al doilea argument al funcției navigate:


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

Acest lucru vă permite să transmiteți date către componenta țintă, care pot fi accesate folosind hook-ul useLocation.

4. Rute Imbricate (Nested) și Layout-uri

Rutele imbricate vă permit să creați structuri de rutare ierarhice, unde o rută este imbricată în alta. Acest lucru este util pentru organizarea aplicațiilor complexe cu mai multe niveluri de navigare. Acest lucru ajută la crearea de layout-uri în care anumite elemente UI sunt prezente în mod constant într-o secțiune a aplicației.

Exemplu: Secțiunea Profil Utilizator

Să presupunem că aveți o secțiune de profil de utilizator cu rute imbricate pentru afișarea informațiilor de profil, setărilor și comenzilor utilizatorului:


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

function Profile() {
  return (
    

User Profile

  • Profile Information
  • Settings
  • Orders
} /> } /> } />
); } function ProfileInformation() { return

Profile Information Component

; } function Settings() { return

Settings Component

; } function Orders() { return

Orders Component

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

În acest exemplu:

* din ruta părinte este crucial; acesta semnifică faptul că ruta părinte ar trebui să se potrivească cu orice sub-cale, permițând rutelor imbricate să fie potrivite corespunzător în interiorul componentei Profile.

5. Gestionarea Erorilor de Tip „Not Found” (404)

Este esențial să gestionați cazurile în care utilizatorul navighează către o rută care nu există. React Router v6 face acest lucru ușor cu o rută de tip catch-all.

Exemplu: Implementarea unei Pagini 404


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

function NotFound() {
  return (
    

404 - Not Found

The page you are looking for does not exist.

Go back to home
); } function App() { return ( } /> } /> } /> ); }

În acest exemplu:

6. Strategii de Încărcare a Datelor cu React Router v6

React Router v6 nu include mecanisme încorporate de încărcare a datelor precum predecesorul său (React Router v5 cu `useRouteMatch`). Cu toate acestea, oferă instrumentele necesare pentru a implementa eficient diverse strategii de încărcare a datelor.

Opțiunea 1: Preluarea Datelor în Componente

Cea mai simplă abordare este să preluați datele direct în componenta care randează ruta. Puteți folosi hook-ul useEffect pentru a prelua datele atunci când componenta se montează sau când se schimbă parametrii URL.


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 

Loading...

; if (error) return

Error: {error.message}

; if (!product) return

Product not found

; return (

{product.name}

{product.description}

); } export default ProductDetails;

Această abordare este directă, dar poate duce la duplicarea codului dacă trebuie să preluați date în mai multe componente. De asemenea, este mai puțin eficientă, deoarece preluarea datelor începe doar după ce componenta este montată.

Opțiunea 2: Utilizarea unui Hook Personalizat pentru Preluarea Datelor

Pentru a reduce duplicarea codului, puteți crea un hook personalizat care încapsulează logica de preluare a datelor. Acest hook poate fi apoi reutilizat în mai multe componente.


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;

Apoi, puteți utiliza acest hook în componentele dvs.:


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 

Loading...

; if (error) return

Error: {error.message}

; if (!product) return

Product not found

; return (

{product.name}

{product.description}

); } export default ProductDetails;

Opțiunea 3: Utilizarea unei Biblioteci de Rutare cu Capacități de Preluare a Datelor (TanStack Router, Remix)

Biblioteci precum TanStack Router și Remix oferă mecanisme încorporate de preluare a datelor care se integrează perfect cu rutarea. Aceste biblioteci oferă adesea funcționalități precum:

Utilizarea unei astfel de biblioteci poate simplifica drastic încărcarea datelor și poate îmbunătăți performanța, în special pentru aplicații complexe.

Renderizare pe Server (SSR) și Generare de Site-uri Statice (SSG)

Pentru o mai bună optimizare SEO și performanță la încărcarea inițială, luați în considerare utilizarea SSR sau SSG cu framework-uri precum Next.js sau Gatsby. Aceste framework-uri vă permit să preluați date pe server sau în timpul procesului de build și să serviți HTML pre-randat clientului. Acest lucru elimină necesitatea ca clientul să preia date la încărcarea inițială, rezultând o experiență mai rapidă și mai prietenoasă cu motoarele de căutare.

7. Lucrul cu Diferite Tipuri de Routere

React Router v6 oferă diferite implementări de router pentru a se potrivi diverselor medii și cazuri de utilizare:

Alegeți tipul de router care se potrivește cel mai bine cerințelor și mediului aplicației dvs.

Concluzie

React Router v6 oferă o soluție de rutare completă și flexibilă pentru aplicațiile React. Înțelegând și aplicând modelele de navigare discutate în acest articol de blog, puteți construi aplicații web robuste, prietenoase cu utilizatorul și ușor de întreținut. De la rutarea declarativă cu <Routes> și <Route> la rute dinamice cu parametri URL, navigare programatică cu useNavigate și strategii eficiente de încărcare a datelor, React Router v6 vă împuternicește să creați experiențe de navigare fluide pentru utilizatorii dvs. Luați în considerare explorarea bibliotecilor de rutare avansate și a framework-urilor SSR/SSG pentru un control și o optimizare a performanței și mai mari. Nu uitați să adaptați aceste modele la cerințele specifice ale aplicației dvs. și să acordați întotdeauna prioritate unei experiențe de utilizare clare și intuitive.