Kdy se stav změní

Tady je obsluha, která změní stav a pak ho vypíše:

function pridejLajk() {
    setLajky(lajky + 1);
    console.log(lajky);
}

Po prvním kliknutí ukáže stránka ♥ 1, ale konzole hlásí 0. Po druhém kliknutí je na stránce ♥ 2 a v konzoli 1. Konzole je pořád o krok pozadu. Je setLajky() pomalá?

Není: lajky totiž vůbec nemění. Ani nemůže, protože lajky je konstanta tohoto vykreslení. setLajky(1) jen Reactu řekne, že od teď budou lajky rovny 1, a React komponentu vykreslí znovu, až obsluha skončí. To nové volání App() má novou konstantu lajky s hodnotou 1. Obsluha, která právě běží, ale patří ke starému vykreslení, kde jsou lajky rovny 0, a pro ni zůstanou nulou až do konce.

Představte si každé vykreslení jako fotku. JSX, obsluhy i hodnoty stavu v ní jsou z jednoho okamžiku a nic na fotce se nemění. Zavolání funkce set… požádá React o novou fotku.

Když obsluha potřebuje novou hodnotu, nejdřív ji spočítejte, uložte do konstanty a použijte na obojí:

function pridejLajk() {
    const noveLajky = lajky + 1;
    setLajky(noveLajky);
    console.log(noveLajky);
}

Teď konzole hlásí 1 zároveň s ♥ 1. Stejné je to s podmínkami: if (lajky === 10) hned za setLajky(lajky + 1) kontroluje starou hodnotu, takže platí o jedno kliknutí později, než byste čekali. Kontrolujte raději noveLajky.

Pokyny

Obsluha vypisuje starý počet lajků. Zařiďte, aby vypisovala nový, tedy číslo, které ukazuje stránka: po prvním kliknutí Lajky: 1.

Když lajky dosáhnou pěti, vypište ještě Noční vlaky mají 5 lajků!, jednou, při kliknutí, po kterém je jich 5.

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

Zpět

5/13

Další