Wat zijn useNavigate en useParams?
Soms wil je niet met een Link navigeren, maar vanuit JavaScript (bijvoorbeeld na een button click). Daarvoor gebruik je useNavigate.
En als je naar een detail pagina gaat (bijvoorbeeld /products/3), dan wil je het ID uit de URL halen. Daarvoor gebruik je useParams.
Voorbeeld situatie:
Je hebt een lijst met producten. Als je op "Meer info" klikt, ga je naar de detail pagina van dat product. Daar zie je alle info over dat specifieke product.
Stap 1: Data Bestand Maken
Maak eerst (als je dat nog niet hebt) een bestand data.js in je src folder met je data:
// src/data.js
export const products = [
{ id: 1, name: "iPhone 15", price: 999, description: "Nieuwste iPhone" },
{ id: 2, name: "Samsung Galaxy", price: 899, description: "Android telefoon" },
{ id: 3, name: "Google Pixel", price: 799, description: "Pure Android" }
];
Stap 2: Folder Structuur Aanmaken
Maak de volgende folders en bestanden aan in je project:
src/
├── components/
│ └── Product.jsx ← Component voor 1 product
├── Pages/
│ ├── Home.jsx ← Home pagina met producten
│ └── ProductDetail.jsx ← Detailpagina
├── data.js ← Data bestand
└── App.jsx ← Routes
Tip: Maak de folders components en Pages aan in je src folder!
Stap 3: Routes Aanmaken
Maak twee routes: één voor de home pagina en één voor de detail pagina.
// src/App.jsx
import { BrowserRouter, Route, Routes } from 'react-router-dom';
import Home from './Pages/Home';
import ProductDetail from './Pages/ProductDetail';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/products/:productId" element={<ProductDetail />} />
</Routes>
</BrowserRouter>
);
}
export default App;
Let op: De :productId is een parameter. Dit wordt straks het ID van het product!
Stap 4: Product Component Maken
Maak nu het herbruikbare Product component. Dit component toont 1 enkel product en heeft een button om naar de detail pagina te gaan.
// src/components/Product.jsx
const Product = ({ product, onShowDetail }) => {
return (
<section>
<h2>{product.name}</h2>
<p>€{product.price}</p>
<button onClick={() => onShowDetail(product.id)}>
Meer info
</button>
</section>
);
};
export default Product;
Wat gebeurt er in dit component?
{product, onShowDetail}- Dit component krijgt 2 props binnenproduct- Het product object met id, name, price, descriptiononShowDetail- Een functie die wordt aangeroepen bij klik op de buttononClick={() => onShowDetail(product.id)}- Roep de functie aan met het product ID
Waarom een apart Product component?
Dit maakt je code herbruikbaar en overzichtelijk. Het Product component kan nu overal gebruikt worden waar je een product wilt tonen!
Stap 5: Home Pagina met Producten
Op de home pagina tonen we alle producten. Voor elk product gebruiken we het Product component. Als je op de button klikt, ga je naar de detail pagina.
// src/Pages/Home.jsx
import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { products } from '../data';
import Product from '../components/Product';
const Home = () => {
const navigate = useNavigate();
const [productList, setProductList] = useState(products);
const goToDetail = (productId) => {
navigate(`/products/${productId}`);
};
return (
<section>
<h1>Welkom bij onze winkel!</h1>
<h2>Onze Producten</h2>
{productList.map(product => (
<Product
key={product.id}
product={product}
onShowDetail={goToDetail}
/>
))}
</section>
);
};
export default Home;
Wat gebeurt er?
const navigate = useNavigate()- Maak een navigatie functieimport { products } from '../data'- Haal de data op uit data.jsimport Product from '../components/Product'- Import het Product componentuseState(products)- Zet de data in stateproductList.map(...)- Loop door alle producten<Product ... />- Gebruik het Product component voor elk productproduct={product}- Geef het hele product object door als proponShowDetail={goToDetail}- Geef de navigatie functie door als propnavigate(`/products/${productId}`)- Navigeer naar bijv./products/1
Voordeel van component: De Home pagina is nu veel overzichtelijker! Het Product component zorgt voor de opmaak en de home pagina hoeft alleen maar te mappen.
Stap 6: Detail Pagina met useParams
Nu maak je de detail pagina. Deze pagina haalt het ID uit de URL en toont het juiste product.
// src/Pages/ProductDetail.jsx
import { useState } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { products } from '../data';
const ProductDetail = () => {
const { productId } = useParams();
const navigate = useNavigate();
const [productList, setProductList] = useState(products);
// Zoek het juiste product
const product = productList.find(p => p.id === Number(productId));
if (!product) {
return <div>Product niet gevonden!</div>;
}
return (
<section>
<button onClick={() => navigate('/')}>
← Terug naar home
</button>
<h1>{product.name}</h1>
<p><strong>Prijs:</strong> €{product.price}</p>
<p><strong>Beschrijving:</strong> {product.description}</p>
</section>
);
};
export default ProductDetail;
Wat gebeurt er?
const { productId } = useParams()- Haal het ID uit de URLimport { products } from '../data'- Haal de data op uit data.jsuseState(products)- Zet de data in stateproducts.find(...)- Zoek het product met het juiste IDNumber(productId)- URL parameters zijn strings, maak er een number vanif (!product)- Check of het product bestaatnavigate('/')- Terug button naar de lijst
Hoe werkt het? - De Complete Flow
- Je gaat naar
/(home pagina) - Home pagina laadt alle producten in
- Voor elk product wordt een
<Product />component gerenderd - Je klikt op "Meer info" bij iPhone 15
- Het Product component roept
onShowDetail(1)aan useNavigatebrengt je naar/products/1useParamshaalt het getal1uit de URL- We zoeken het product met
id: 1 - We tonen alle info van dat product
Belangrijk: URL parameters zijn altijd strings! Gebruik Number(productId) om er een getal van te maken.
Andere Voorbeelden
Navigeren naar home:
const navigate = useNavigate();
<button onClick={() => navigate('/')}>
Naar home
</button>
Terug navigeren (zoals browser terug knop):
const navigate = useNavigate();
<button onClick={() => navigate(-1)}>
Terug
</button>
Meerdere parameters in URL:
// Route: shop/:category/:productId
const { category, productId } = useParams();
// URL: /shop/electronics/5
// category is "electronics"
// productId is "5"
Veelgemaakte Fouten
Fout 1 - Import vergeten:
const navigate = useNavigate();
// Error: useNavigate is not defined
Goed:
import { useNavigate } from 'react-router-dom';
const navigate = useNavigate();
Fout 2 - Vergeten Number():
const { productId } = useParams();
const product = products.find(p => p.id === productId);
// Werkt niet! "1" !== 1
Goed:
const product = products.find(p => p.id === Number(productId));
Fout 3 - navigate direct aanroepen:
<button onClick={navigate('/home')}>
Home
</button>
// Navigeert meteen bij render!
Goed:
<button onClick={() => navigate('/home')}>
Home
</button>
Fout 4 - Verkeerde parameter naam:
// Route: products/:productId
const { id } = useParams();
// Undefined!
Goed:
// Route: products/:productId
const { productId } = useParams();
// Werkt!
Fout 5 - Product component vergeten te importeren:
<Product product={product} />
// Error: Product is not defined
Goed:
import Product from '../components/Product';
<Product product={product} />
Handy Tips
- Maak eerst je folder structuur en alle components aan voordat je begint
- Gebruik
useNavigatevoor button clicks - Gebruik
useParamsom IDs uit de URL te halen - URL parameters zijn altijd strings, gebruik
Number()voor getallen - De parameter naam moet exact hetzelfde zijn als in de Route (
:productId) navigate(-1)gaat één pagina terug- Data altijd uit een apart
data.jsbestand halen - Maak herbruikbare components zoals
Productom je code overzichtelijk te houden