
Nepamatuju si větší napětí v React komunitě od releasu react hooků ve verzi React 16.8. Konečně se to po pár letech povedlo, a to konkrétně s verzí React 19. Je boom opodstatněný, nebo zas jen javascriptová bublina spustila davové šílenství? Kdo jsem já, abych soudil, verdikt nechám na vás. 👀
Než se pustíte do nespočtu videí a blog postů, krátce bych upozornil, že v různých zdrojích se vyskytují chybné příklady a použití. Nebudu na nikoho ukazovat prstem – API nových featur se měnilo za pochodu, a tudíž se před oficiálním releasem protagonisti daných materiálů nemuseli dostat k relevantním informacím. Buďte obezřetní a hledejte materiály vydané až PO oficiálním releasu beta verze, kterým je 25. 4. 2024. 🏷️
Většinu nových featur jsem testoval na konkrétních příkladech, které můžete i sami vyzkoušet v tomto repozitáři, který mi sloužil jako playground a nechávám ho dále k dispozici i pro vás. Pár hlavních bodů si ukážeme přímo v článku, zbytek už dohledáte v ukázkovém projektu.
Pokud byste chtěli sami upgradnout na novou verzi, doporučuju vám projít si nový migration guide, který jednak obsahuje přesný návod na instalaci a jednak i použití připravených codemode skriptů na automatickou migraci vašeho stávajícího kódu, což velmi oceňuju.
🦹 Jaké key features nová verze Reactu obsahuje?
Actions (nebo dříve Server actions) nám umožňují z klienta volat asynchronní funkce, které jsou vykonány na serveru. Pomocí direktivy "use server" použitý framework vytvoří referenci a po zavolání z klient komponenty pošle request na server, kde funkci vykoná. Typický příklad zavolání takové funkce je změna jména uživatele, kde jednoduchý formulář může vypadat takto:
export const Form = () => {
return (
<form action={updateName}>
<input type="text" name="name" />
<button type="submit">{"Upravit jméno"}</button>
</form>
);
};
Jelikož < form > v ukázce je přímo (jak v týmu pracovně říkáme) “rejpnutá” nativní komponenta do reactí komponenty, po submitu formuláře je přímo zavolána akce, která nám upraví nové jméno v databázi (což máme nasimulované jen jednoduchou Promise).
"use server";
export async function updateName(name?: string) {
if (!name) {
return { error: "Jméno je povinné" };
}
// Todo: Update name via API
await new Promise((r) => setTimeout(r, 3000));
// await db.users.updateName(name);
}
✨ Spousta zábavy s novými React hooky
Zůstaňme u stejného příkladu a zkusme ho rozšířit o submit tlačítko, které se bude měnit podle stavu formuláře.
<form action={updateName}>
<input type="text" name="name" />
<SubmitButton />
</form>
Běžný příklad ze života je po odpálení formuláře změnit submit tlačítko na stav disabled (popřípadě mu ještě změnit text), aby uživatel věděl, že se něco děje a zároveň nemohl daný formulář odeslat vícekrát za sebou. Na to nám poslouží useFormStatus, který sám vyhodnotí, v kontextu jakého formuláře se nachází, a vrátí nám stav daného formuláře.
export const SubmitButton = () => {
const { pending } = useFormStatus();
return (
<button type="submit" disabled={pending}>
{pending ? "Upravuju..." : "Upravit jméno"}
</button>
);
};