Hooky & Kontrola stavu
V minulé kapitole jste si možná v jednom z příkladů všimli „magické“ funkce useState, díky které se po kliknutí na tlačítko změnilo číslo na tlačítku.
V této kapitole se podíváme na to, jak můžeme ovládat stav naší aplikace a jaké všechny hooky máme k dispozici.
import { useState } from 'react';
function Tlacitko() {
const [pocet, nastavitPocet] = useState(0);
return (
<button onClick={() => nastavitPocet(pocet + 1)}>
Zmáčknuto {pocet} krát.
</button>
);
}
Jedná se o nejprimitivnější hook – funkci, která nám vrátí tzv. getter a setter, neboli hodnotu a funkci pro její změnu.
Proč ale musíme používat
useStatea nemůžeme proměnnou jen nastavit?
Nejjednodušší odpověď je, že React nemá jak poznat, že se hodnota změnila – tudíž netuší, že má komponentu znovu vykreslit.
Další často používaný hook je useEffect. Na první pohled jednoduchý, ale může způsobit spoustu problémů, takže s ním zacházejte opatrně.
useEffect je hook, který bere dva parametry. Prvním je funkce, která se má zavolat při změně. Druhým je pole závislostí – hodnot, při jejichž změně se funkce spustí.
useEffect můžeme spustit při inicializaci komponenty i při jejím opuštění. (O tom více v další kapitole.)
Zde vidíme realističtější příklad použití hooku useEffect.
import { useEffect } from 'react';
import { pripojSeKchatu } from './chat.js';
function ChatSkupina({ idSkupiny }) {
const adresaServeru = 'wss://chat.com';
const [zpravy, nastavZpravy] = useState('');
useEffect(() => {
// Při inicializaci komponenty se spojí klient se serverem
const spojeni = pripojSeKchatu(adresaServeru, idSkupiny);
spojeni.connect();
nastavZpravy(spojeni.zpravy);
return () => {
// Nechceme nechávat spojení běžet zbytečně – po opuštění stránky ho ukončíme
spojeni.disconnect();
};
}, [adresaServeru, idSkupiny]);
}
Hooky useMemo a useCallback zmiňuji spíše proto, že se s nimi určitě setkáte v pokročilejších aplikacích. Slouží hlavně k optimalizaci.
Na začátku tohoto roku byl ale představen React Compiler, který by měl tyto optimalizace zvládat automaticky – proto je zde probereme jen stručně.
V obou případech jde o funkce se dvěma parametry. Prvním je funkce, která něco vrací (u useMemo hodnotu, u useCallback funkci). Druhým je pole závislostí. Pokud se nějaká hodnota změní, výpočet proběhne znovu – jinak se použije ta původní.
import { useMemo, useCallback, useState } from 'react';
function App() {
const [jmena, nastavJmena] = useState(["Adéla", "Bob", "Cindy", "Arnošt", "Dan", "Adam"]);
// Třídění pole může být náročná operace, proto je výhodné výsledek zapamatovat
const jmenaPodleAbecedy = useMemo(() => jmena.slice().sort().join(", "), [jmena]);
const vypisJmenaAObratJe = useCallback(() => {
console.log("Původní:", jmena.join(", "));
nastavJmena([...jmena].reverse());
}, [jmena]);
return (
<div>
<button onClick={vypisJmenaAObratJe}>Obrať pořadí jmen</button>
<div>Jména podle abecedy: {jmenaPodleAbecedy}</div>
</div>
);
}
Poslední hook, který si v této kapitole vysvětlíme, je useContext. Umožňuje nám vytvořit tzv. kontext – neboli data, která jsou přístupná více komponentám (konkrétně všem „potomkům“ poskytovatele kontextu). Nejlépe to pochopíme na příkladu:
Toto však ale nejsou všechny hooky, existuje i spousta dalších, zde jsme pouze zmínili ty nejčastější.
Pokud by jste narazili na nějaký který případně neznáte, neváhejte se podívat do dokumentace
Malý tip nakonec: hook poznáte podle toho že většínou začínají na
use.