Váš první stav
Na konci minulé lekce se stránka neměnila: React nevěděl, že se lajky změnily, a každé vykreslení by je stejně začalo znovu od nuly. Pomůže stav, hodnota, kterou si React pro komponentu pamatuje. Vytvoříte ho pomocí useState:
import { useState } from "react";
export default function App() {
const [lajky, setLajky] = useState(0);
function pridejLajk() {
setLajky(lajky + 1);
}
return (
<main>
<h1>Sový sbor</h1>
<p>♥ {lajky}</p>
<button onClick={pridejLajk}>Líbí se mi</button>
</main>
);
}Teď každé kliknutí přičte 1 a stránka to ukáže. Projděme to řádek po řádku:
useStateje funkce Reactu. Naimportujte ji nahoře v souboru, ve složených závorkách, jako se importují pojmenované exporty.useState(0)dá komponentě stav, který začíná na nule. Vrátí pole dvou věcí, které rozložíte do konstant:lajky, současnou hodnotu, asetLajky, funkci, která ji mění. Názvy si vybíráte sami. Obvykle se jmenujínecoasetNeco.setLajky(lajky + 1)řekne Reactu novou hodnotu. React pak komponentu znovu vykreslí: ještě jednou zavoláApp()a tentokrátuseState(0)vrátí 1, protože počáteční hodnotu použije jen poprvé. V JSX je teď ♥ 1 a React podle toho změní odstavec na stránce.
Pořadí je tedy vždycky stejné: událost, obsluha, která zavolá funkci set…, nové vykreslení s novou hodnotou a stránka, která ji ukáže. Stránku nikdy neměníte sami.
Funkcím Reactu, jejichž název začíná use, jako useState, se říká hooky. Volejte je nahoře v komponentě, před vším ostatním, a nikdy uvnitř if, cyklu nebo obsluhy. Další hooky poznáte dál v kurzu.
Typické chyby:
lajky = lajky + 1nebolajky++v obsluze.lajkyje konstanta, takže konzole hlásíTypeError: Assignment to constant variable.A i kdyby nebyla, React by o změně nevěděl. Stav mění jen jeho funkceset….- Chybí
importfunkceuseState. Stránka zůstane prázdná a konzole hlásíReferenceError: useState is not defined.
Jak psát:
Pokyny
Nahraďte proměnnou lajky stavem, aby každé kliknutí na Líbí se mi přičetlo k číslu na stránce jedničku. (console.log() můžete smazat.)
Za tlačítko Líbí se mi přidejte tlačítko Vynulovat, které nastaví lajky zpátky na 0.