Lekce 2: Routing a komponenty
V minulé lekci jste si úspěšně rozjeli svůj první Next.js projekt. V této lekci se ponoříme hlouběji do **file-based routingu** a ukážeme si, jak tvořit a používat **komponenty**, které jsou základním stavebním kamenem každé React aplikace.
Shrnutí lekce:
V této lekci se naučíte, jak vytvořit složitější strukturu stránek a jak si zjednodušit práci s opakovaně použitelnými prvky. Níže najdete odkazy na jednotlivé části lekce:
File-based routing v Next.js
Next.js používá **file-based routing**, což znamená, že každá stránka je automaticky vytvořena na základě souboru v adresáři app/. Například vytvořením souboru app/products/page.tsx získáte stránku dostupnou na URL /products.
// app/products/page.tsx
export default function ProductsPage() {
return <h1>Stránka s produkty</h1>;
}
Dynamické route
Pokud chcete mít stránky pro jednotlivé produkty (např. /products/1, /products/2), použijete **dynamické route** s názvem souboru v hranatých závorkách.
// app/products/[id]/page.tsx
export default function ProductPage({ params }) {
return <h1>Produkt s ID: {params.id}</h1>;
}
Layouty a šablony
**Layouty** (layout.tsx) jsou komponenty, které obalují celou vaši aplikaci nebo její část a definují opakovaně použitelnou strukturu (např. navigace, zápatí). Vytvořením app/layout.tsx ovlivníte celou aplikaci.
// app/layout.tsx
import './globals.css';
import Link from 'next/link';
export default function RootLayout({ children }) {
return (
<html lang="cs">
<body>
<header>
<nav>
<Link href="/">Domů</Link>
<Link href="/products">Produkty</Link>
</nav>
</header>
<main>{children}</main>
</body>
</html>
);
}
Navigace pomocí <Link> a <useRouter>
Pro navigaci se stále používá <Link>. Pokud ale potřebujete navigovat programově (např. po odeslání formuláře), použijete **hook** useRouter.
// components/MyForm.tsx
'use client'; // Tento hook je na straně klienta
import { useRouter } from 'next/navigation';
export default function MyForm() {
const router = useRouter();
const handleSubmit = (e) => {
e.preventDefault();
// Po úspěšném odeslání přesměrovat na domovskou stránku
router.push('/');
};
return (
<form onSubmit={handleSubmit}>
<button type="submit">Odeslat a přesměrovat</button>
</form>
);
}
Vytvoření základních komponent
Komponenty jsou nezávislé a opakovaně použitelné části UI. Vytvořte si adresář components/ a v něm soubory pro **Header** a **Footer**.
// components/Header.tsx
export default function Header() {
return (
<header>
<h1>Můj eshop</h1>
</header>
);
}
// components/Footer.tsx
export default function Footer() {
return (
<footer>
<p>© {new Date().getFullYear()} Můj eshop</p>
</footer>
);
}
Práce s komponentami – props, children
**Props (properties)** jsou způsob, jakým předáváte data z jedné komponenty do druhé. **Children** je speciální prop, která obsahuje obsah obsažený mezi otevíracím a uzavíracím tagem komponenty.
// components/Card.tsx
export default function Card({ title, content, children }) {
return (
<div>
<h3>{title}</h3>
<p>{content}</p>
<div>
{children}
</div>
</div>
);
}
// Použití na stránce
import Card from '../components/Card';
export default function HomePage() {
return (
<Card title="První karta" content="Toto je obsah karty.">
<p>Toto je children prop.</p>
</Card>
);
}
Základní state pomocí React hooks (<code>useState</code>)
**State** je proměnná, která drží stav komponenty. Když se stav změní, React komponentu překreslí. Pro správu stavu použijeme **hook** useState.
// components/Counter.tsx
'use client'; // useState je hook na straně klienta
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Počet: {count}</p>
<button onClick={() => setCount(count + 1)}>Přičíst</button>
</div>
);
}
Použití Tailwind CSS a stylování
Pro rychlé stylování doporučujeme nainstalovat **Tailwind CSS**.
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
Následně přidáte třídy přímo do JSX kódu pro stylování komponent.
// components/Button.tsx
export default function Button({ text }) {
return (
<button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
{text}
</button>
);
}
Vynikající! V této lekci jste se naučili, jak tvořit dynamické stránky a opakovaně použitelné komponenty. Znáte základy práce s props a useState, což je klíčové pro interaktivní aplikace.
´