04 — Page komponenty (page.js / page.tsx)
Výuka
Proč to existuje?
Každá webová aplikace potřebuje stránky — domovskou stránku, stránku "O nás", blog, produkty, atd. V tradičních frameworcích musíš ručně říct, která komponenta se zobrazí na které URL.
Next.js to zjednodušuje pomocí speciálního souboru page.js — každý soubor s názvem page.js se automaticky stane stránkou na příslušné URL.
Co je page komponenta?
Page je React komponenta, která obsahuje obsah stránky pro konkrétní URL. Je to "hlavní věc", kterou uživatel uvidí, když navštíví danou adresu.
Představ si to jako plakát na dveřích místnosti: když vejdeš do místnosti (navštívíš URL), uvidíš plakát (page obsah).
Jak to funguje?
Next.js hledá soubory s názvem page.js nebo page.tsx v adresáři app/ a automaticky je mapuje na URL:
Pravidlo:
app/page.js→ stránka na URL/(domovská stránka)app/about/page.js→ stránka na URL/aboutapp/blog/page.js→ stránka na URL/blogapp/blog/[slug]/page.js→ dynamická stránka/blog/jakykoli-clanek
Důležité:
- Pouze soubory s názvem
page.jsse stanou stránkami - Ostatní soubory (komponenty, utility) můžeš pojmenovat libovolně — nestanou se stránkami
K čemu to slouží?
- Jasná organizace — víš, které soubory jsou stránky (všechny se jmenují
page.js) - Automatický routing — nepotřebuješ konfiguraci
- Izolace obsahu — každá stránka má svůj soubor
- Server components by default — stránky se vykreslují na serveru (rychlejší načítání)
JavaScript
// app/page.js (domovská stránka - /)
export default function Home(){
return (
<div>
<h1>Vítejte na našem webu</h1>
<p>Toto je domovská stránka</p>
</div>
)
}
// app/about/page.js (stránka O nás - /about)
export default function About(){
return (
<div>
<h1>O nás</h1>
<p>Jsme tým vývojářů...</p>
</div>
)
}
// app/contact/page.js (kontakt - /contact)
export default function Contact(){
return (
<div>
<h1>Kontakt</h1>
<form>
<input type="email" placeholder="Váš email" />
<button>Odeslat</button>
</form>
</div>
)
}
TypeScript
// app/page.tsx
export default function Home(): JSX.Element{
return (
<div>
<h1>Vítejte na našem webu</h1>
<p>Toto je domovská stránka</p>
</div>
)
}
// app/about/page.tsx
export default function About(): JSX.Element{
return (
<div>
<h1>O nás</h1>
<p>Jsme tým vývojářů...</p>
</div>
)
}
// Page s async data loading (server component)
interface Post {
id: number
title: string
}
export default async function BlogPage(): Promise<JSX.Element>{
const posts: Post[] = await fetch('https://api.example.com/posts')
.then(r => r.json())
return (
<div>
<h1>Blog</h1>
{posts.map(post => (
<article key={post.id}>
<h2>{post.title}</h2>
</article>
))}
</div>
)
}
Rozdíl JS vs TS
TypeScript přidává:
- Návratové typy (
JSX.Element,Promisepro async) - Typy pro props (když stránka přijímá params nebo searchParams)
- Typy pro data (když načítáš data z API)
To zajišťuje, že pracuješ se správnými daty a předcházíš runtime chybám.
Server vs Client Components
Server Component (výchozí)
// app/blog/page.js
// Toto je server component (výchozí, bez "use client")
export default async function BlogPage(){
// Můžeš přímo fetchovat data
const posts = await fetch('https://api.example.com/posts').then(r => r.json())
return (
<div>
{posts.map(post => <Article key={post.id} {...post} />)}
</div>
)
}
Výhody:
- Může přímo přistupovat k databázi nebo API
- Menší JavaScript bundle (rychlejší načítání)
- Lepší SEO (HTML se generuje na serveru)
Client Component
// app/search/page.js
"use client" // Označení client komponenty
import { useState } from 'react'
export default function SearchPage(){
const [query, setQuery] = useState('')
return (
<div>
<input
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Hledat..."
/>
<p>Hledáš: {query}</p>
</div>
)
}
Kdy použít:
- Potřebuješ React hooks (
useState,useEffect, atd.) - Event handlers (onClick, onChange)
- Interaktivní komponenty (formuláře, modaly)
Tip
- Výchozí = server component — rychlejší a efektivnější
- Přidej
"use client"jen když musíš — pro interaktivitu - Pojmenování funkce — měj konzistentní pojmenování (např. název složky + "Page")
- Export default — page komponenta musí být default export
Mapování stránek — ASCII diagram
Jak page soubory mapují na URL:
app/
├─ page.js # → / (domovská stránka)
├─ about/
│ └─ page.js # → /about
├─ contact/
│ └─ page.js # → /contact
├─ products/
│ ├─ page.js # → /products
│ └─ [id]/
│ └─ page.js # → /products/123 (dynamický)
└─ blog/
├─ page.js # → /blog
└─ [slug]/
└─ page.js # → /blog/muj-clanek (dynamický)
Důležité poznámky:
- Složky bez
page.jsnejsou přístupné jako URL - Můžeš mít komponenty v jiných souborech — nestanou se stránkami
page.js= veřejně přístupná stránka
Kvíz
Co dělá soubor page.js v Next.js?
Soubor page.js (nebo page.tsx) je speciální soubor v Next.js, který definuje obsah stránky pro konkrétní URL. Například app/about/page.js vytvoří stránku na adrese /about. Pouze soubory s názvem page.js se stanou veřejně přístupnými stránkami — ostatní soubory ve složce app/ jsou ignorovány z pohledu routingu.
🎯 Závěrečný projekt
Po dokončení všech 8 dílů vytvoříte jednoduchou Todо aplikaci v čistém JavaScriptu. Naučíte se, jak aplikovat vše, co jste se naučili, na reálný projekt.
Zobrazit podrobnosti projektu →Informace o seriálu
Obtížnost
Délka
Cca 480 minut
Počet videí
8 videí + projekty
Certifikát
Po dokončení obdržíte certifikát
Lekce v této sekci
- 01 — Co je Next.js
- 02 — Vytvoření projektu
- 03 — Struktura projektu (app/)
- 04 — Page komponenty (page.js / page.tsx)
- 05 — Layout komponenty (layout.js / layout.tsx)
- 06 — File-based routing
- 07 — Dynamické routy ([id]/page.js)
- 08 — Link komponenta (navigace)
- 09 — Image komponenta (next/image)
- 10 — Metadata (title, description, Open Graph)
- 11 — Loading UI (loading.js / loading.tsx)
- 12 — Error handling (error.js / error.tsx)
- 13 — Not Found (not-found.js / not-found.tsx)
Struktura lekcí (souborový strom)
- 1.1 Úvod do JavaScriptu a TypeScriptu
- 1.2 Nastavení prostředí
- 1.3 První program
- 1.4 Proměnné: var, let, const
- 1.5 Datové typy - přehled
- 1.6 String (řetězce)
- 1.7 Number (čísla)
- 1.8 Boolean (pravda/nepravda)
- 1.9 Null a Undefined
- 1.10 Type Inference vs Annotations
- 1.11 Aritmetické operátory
- 1.12 Porovnávací operátory
- 1.13 Logické operátory
- 1.14 Komentáře
- 1.15 Console metody
- 03.01 Deklarace funkce
- 03.02 Function Expression
- 03.03 Arrow Functions
- 03.04 Parametry a argumenty
- 03.05 Return hodnoty
- 03.06 Výchozí parametry
- 03.07 Rest parametry
- 03.08 Co je Scope
- 03.09 Lexikální Scope
- 03.10 Řetězec Scope
- 03.11 Globální Scope
- 03.12 Životní Cyklus Proměnných
- 03.13 Omezení Scope
- 03.14 Použití Closures
- 03.15 Callback funkce
- 03.16 Higher-order Functions
- 03.17 IIFE
- 03.18 Void funkce
- 03.19 Rekurze
- v přípravě
- v přípravě
- v přípravě
- v přípravě
- 01 — Co je Next.js
- 02 — Vytvoření projektu
- 03 — Struktura projektu (app/)
- 04 — Page komponenty (page.js / page.tsx)
- 05 — Layout komponenty (layout.js / layout.tsx)
- 06 — File-based routing
- 07 — Dynamické routy ([id]/page.js)
- 08 — Link komponenta (navigace)
- 09 — Image komponenta (next/image)
- 10 — Metadata (title, description, Open Graph)
- 11 — Loading UI (loading.js / loading.tsx)
- 12 — Error handling (error.js / error.tsx)
- 13 — Not Found (not-found.js / not-found.tsx)
- v přípravě
- v přípravě
- v přípravě