Slovník pojmů
React
React skládá uživatelské rozhraní z komponent, které převádějí data a stav na výsledný vzhled. Je to knihovna, ne kompletní aplikační framework, a sama neurčuje backend, databázi ani celý způsob nasazení.
Stručná definice
Knihovna pro komponentové uživatelské rozhraní.
JavaScript je programovací jazyk, zatímco React je knihovna nad ním. Vývojář popíše obrazovku pomocí komponent a React je zavolá s aktuálními vstupy, aby zjistil, co se má zobrazit. JSX umožňuje psát značkám podobný zápis přímo vedle logiky renderování; není to HTML řetězec ani nový samostatný jazyk.
DOM není součástí samotného balíčku React. Webová aplikace používá React DOM, který vytvoří kořen aplikace, při změnách provede commit potřebných operací do DOM a při hydrataci připojí interakce k HTML vytvořenému na serveru. React lze prostřednictvím jiného rendereru použít i mimo web.
React sám nedodává kompletní routing, databázovou vrstvu ani backend. Next.js je naproti tomu React framework, který přidává routing, serverové schopnosti, build a konvence pro celou aplikaci. React také není synonymum pro SPA: může řídit jednu interaktivní část stránky i aplikaci kombinující serverové a klientské renderování.
Jaký problém řeší
Udržuje rozhraní v souladu s daty a stavem.
Při ruční práci s DOM musí kód hlídat, který prvek vytvořit, změnit nebo odstranit po každé interakci. React dovoluje deklarovat požadovaný výsledek pro aktuální props a state a opakované změny rozdělit do znovu použitelných komponent.
- produktové karty, filtry, košík, formuláře a další rozhraní reagující na události uživatele
- sdílení opakovaného vzhledu a chování pomocí komponent bez kopírování DOM operací
- modelování loading, error, empty a success stavů při komunikaci s API
- skládání větších obrazovek z menších částí se zřetelnými vstupy a odpovědnostmi
- postupné doplnění interaktivity do serverově vytvořeného HTML i stavba rozsáhlejšího frontendu
Praktický příklad
Produktová karta s dostupností a košíkem
Název, cena, dostupnost a obsluha košíku přicházejí jako props. Lokální state uchovává pouze počet přidání provedených v této kartě. Funkce předaná do onClick se spustí až při události; během renderu se nemění okolní data ani DOM.
V reálné aplikaci by onAddToCart obvykle volala vyšší aplikační vrstvu. Ta musí zobrazit průběh a chybu, ošetřit opakované odeslání a respektovat autoritativní odpověď serveru. Lokální číslo v komponentě není zdroj pravdy pro obsah objednávky.
TypeScript / React (TSX)
import { useState } from 'react';
type ProductCardProps = {
id: string;
name: string;
price: string;
inStock: boolean;
onAddToCart: (productId: string) => Promise<void>;
};
export function ProductCard({
id, name, price, inStock, onAddToCart,
}: ProductCardProps) {
const [addedCount, setAddedCount] = useState(0);
const [isAdding, setIsAdding] = useState(false);
const [error, setError] = useState<string | null>(null);
async function handleAdd() {
setIsAdding(true);
setError(null);
try {
await onAddToCart(id);
setAddedCount((count) => count + 1);
} catch {
setError('Přidání se nepodařilo. Zkuste to znovu.');
} finally {
setIsAdding(false);
}
}
return (
<article>
<h2>{name}</h2>
<p>{price}</p>
<p>{inStock ? 'Skladem' : 'Není skladem'}</p>
<button type="button" disabled={!inStock || isAdding} onClick={handleAdd}>
{isAdding ? 'Přidávám…' : 'Přidat do košíku'}
</button>
{addedCount > 0 && <p aria-live="polite">Přidáno: {addedCount}×</p>}
{error && <p role="alert">{error}</p>}
</article>
);
}
Jak funguje
Props a state → render komponent → React DOM → uživatelské rozhraní.
Renderování v Reactu neznamená automaticky změnu každého DOM uzlu. React nejprve vypočítá nový popis rozhraní a teprve v commit fázi promítne potřebné rozdíly.
- Props dodají vstup Rodič předá potomkovi hodnoty a callbacky. Props jsou pro daný render read-only snapshot a komponenta je nemá měnit.
- State uchová paměť Hook useState nebo useReducer uchová hodnotu mezi rendery. Aktualizace state zařadí nový render, nezmění okamžitě již běžící snapshot.
- React zavolá komponenty Funkční komponenty čistě spočítají JSX z props, state a contextu. Stejné vstupy mají vést ke stejnému výsledku bez vedlejších efektů během renderu.
- React DOM provede commit Webový renderer upraví pouze ty vlastnosti a uzly DOM, které se mají podle nového výsledku změnit. Samotný prohlížeč potom obrazovku vykreslí.
- Událost spustí další změnu Kliknutí, změna formuláře nebo odpověď externího systému může aktualizovat state a celý cyklus zopakovat.
Hlavní části a koncepty
Komponenty oddělují odpovědnosti, hooks zpřístupňují schopnosti Reactu.
Moderní React používá jako výchozí styl funkční komponenty. Class components jsou stále podporované kvůli existujícím aplikacím, ale oficiální dokumentace je pro nový kód nedoporučuje.
Komponenta a JSX
Komponenta je JavaScriptová funkce vracející React nodes. JSX zjednodušuje zápis elementů a výrazů; výsledná sémantika a přístupnost stále závisí na zvoleném HTML.
Props a state
Props přicházejí z rodiče, state patří konkrétní pozici komponenty ve stromu. Hodnotu odvoditelnou z existujících props nebo state obvykle není potřeba ukládat podruhé.
Hooks
Hooks jako useState, useContext a useRef zpřístupňují React funkce z komponent. Nejsou alternativou ke komponentám a platí pro ně pravidla volání na nejvyšší úrovni React funkce.
Události a formuláře
Handler se předává jako funkce, nikoli jako výsledek jejího okamžitého volání. Formulář může být řízený state, ale nativní label, validace, submit a focus mají dál svůj význam.
Composition a context
Komponenty se skládají vnořením a přes children. Context zpřístupní hodnotu vzdálenějším potomkům, nemá však bezdůvodně nahrazovat běžné props ani vytvořit globální state pro každou hodnotu.
Refs a efekty
Ref umožní cílený přístup k DOM uzlu nebo hodnotě mimo render. Effect synchronizuje komponentu s externím systémem; oba mechanismy jsou únikové cesty, ne výchozí místo pro běžný datový tok.
Výhody, omezení a časté chyby
Deklarativní rozhraní pomáhá, ale špatný stav zůstane složitý.
Konkrétní přínosy
- znovu použitelné komponenty se zřetelnými vstupy a složením
- sjednocený model událost → změna state → nový render
- možnost sdílet logiku pomocí vlastních hooks bez kopírování UI
- spolupráce s klientským, serverovým i statickým renderováním podle zvoleného frameworku
Omezení a časté chyby
- použít useEffect pro odvozenou hodnotu nebo přímou reakci na kliknutí místo výpočtu či handleru
- přesunout vše do globálního state a znejasnit vlastnictví dat
- zaměnit lokální React state za vzdálený server state, který může zastarat
- dělit komponenty pouze podle počtu řádků místo soudržné odpovědnosti
- považovat opakovaný render automaticky za problém bez měření skutečného výkonu
- spoléhat na React jako na automatickou záruku přístupnosti, bezpečného HTML nebo správného focusu
Praktické použití a porovnání
React dává smysl pro stavové rozhraní, ne pro každou stránku.
V administraci e-shopu může React spojit filtry, editaci variant, průběžnou validaci a stav několika API požadavků. Malá obsahová stránka s odkazy a jedním formulářem může být naopak jednodušší jako serverové HTML s cíleným JavaScriptem. Rozhoduje množství interakcí, životnost projektu a schopnost týmu udržovat frontend, ne samotná popularita knihovny.
Při čistém client-side renderingu vytvoří hlavní obsah JavaScript v prohlížeči. React ale umí také hydratovat HTML vytvořené na serveru a framework může komponenty vykreslit předem. React proto není synonymem CSR, SSR ani konkrétního navigačního modelu.
API zůstává samostatným kontraktem. React může zobrazovat jeho data a lokální stav požadavku, ale backend dál validuje vstup, rozhoduje o oprávnění a potvrzuje změnu košíku či objednávky. Knihovna pro server state nebo framework může řešit cache a načítání lépe než ruční useEffect v každé komponentě.
React komponenta není Web Component. React komponentu vyhodnocuje React a její props jsou součástí React stromu; Web Component je standardní custom element registrovaný v prohlížeči. Oba modely lze propojit, ale mají jiný životní cyklus, distribuci i práci s DOM.
Kontrola implementace
Nejdřív vlastnictví stavu, potom optimalizace.
Dobrá komponenta má jasný význam, sémantický výstup a předvídatelný tok dat. Výkon i přístupnost je potřeba ověřovat na skutečné uživatelské cestě.
- držet state co nejblíže komponentám, které jej skutečně sdílejí, a neukládat odvozené hodnoty duplicitně
- provádět akce vyvolané uživatelem v event handleru a effect ponechat synchronizaci s externím systémem
- modelovat loading, error, empty a success stav a nevydávat lokální optimistickou změnu za potvrzení serveru
- používat sémantické HTML, viditelný focus, labely formulářů a ovládání klávesnicí
- profilovat konkrétní problém před memoizací a kontrolovat velikost klientského JavaScriptu
Časté otázky
React bez častých záměn
Je React framework?
V obecném smyslu ne. React je knihovna pro uživatelská rozhraní. Framework jako Next.js nad ní doplňuje routing, serverové funkce, build a další aplikační konvence.
Je React určený jen pro single-page aplikace?
Ne. Může řídit jednu část klasické stránky, celou SPA i rozhraní kombinující serverové, statické a klientské renderování.
Jsou hooks náhradou komponent?
Ne. Hooks zpřístupňují state, context, refs a další schopnosti z funkčních komponent nebo vlastních hooks. Samy žádné uživatelské rozhraní netvoří.
Patří každá logika do useEffect?
Ne. Odvozené hodnoty se obvykle počítají při renderu a uživatelské akce patří do handlerů. Effect je určen hlavně k synchronizaci s externím systémem.
Zaručí React výkon a přístupnost?
Ne. Výsledek závisí na datovém toku, množství klientského kódu, sémantickém HTML, práci s focusem a měření reálného chování aplikace.
Osobní zkušenost
Frontendové rozhraní posuzuji společně s API a serverovými hranicemi.
Při vývoji webových aplikací propojuji stav rozhraní, chybové scénáře a přístupnost s autoritativním chováním backendu.