Slovíčka ze souboru
Jedna kartička ještě není balíček. Slovíčka pro balíček jsou v souboru slovicka.json na poslední záložce editoru: dvanáct objektů a každý má id, anglické slovíčko v anglicky a české v cesky. První dva vypadají takhle:
[
{ "id": 1, "anglicky": "cat", "cesky": "kočka" },
{ "id": 2, "anglicky": "dog", "cesky": "pes" },
…
]Načtete je stejně jako v lekci Efekty: pomocí fetch() v efektu se závislostmi [], takže se spustí jednou, po prvním vykreslení komponenty App. Dokud slovíčka nepřijdou, není co ukázat. Stav slovicka proto začíná jako null a dokud je null, vrátí App jen zprávu, ještě než se dostane ke kartičce:
if (slovicka === null) {
return <p>Načítám…</p>;
}
const karticka = slovicka[0];Pod touto podmínkou už slovíčka jsou a karticka je první z nich. Její vlastnosti dostane kartička jako props: <Karticka slovo={karticka.anglicky} preklad={karticka.cesky} />.
V lekci Efekty říkala, jestli data ještě nedorazila, samostatná stavová proměnná nacitani. Tady to slovicka řeknou sama: dokud slovíčka nedorazí, jsou null, a potom pole. Druhou stavovou proměnnou proto nepotřebujete.
A co když se soubor načíst nepodaří? Pak slovicka zůstane null a aplikace by navždy ukazovala Načítám…. Lepší je říct, co se stalo: druhá stavová proměnná, chyba, dostane zprávu a App ji ukáže. Kontrolujte ji dřív než slovicka === null, protože po nepovedeném načtení platí obojí.
Typické chyby:
useStatenebouseEffectpod podmínkamiif. React potřebuje při každém vykreslení zavolat stejné hooky ve stejném pořadí areturnv podmínce by je přeskočil. Hooky patří vždycky na začátek komponenty.- Zapomenuté
[]na konciuseEffect. Efekt se pak spustí po každém vykreslení: načte slovíčka,setSlovicka()komponentu znovu vykreslí a efekt je načte znovu, pořád dokola. slovicka[0]nad podmínkou. První vykreslení pak skončí chybouTypeError: Cannot read properties of null (reading '0').
Jak psát:
Pokyny
V App.jsx přidejte stav slovicka, na začátku null, a efekt, který načte slovicka.json a pomocí setSlovicka() do něj slovíčka uloží. Dokud je slovicka rovno null, vraťte <p>Načítám…</p>. Pak místo psa ukažte kartičku prvního slovíčka, slovicka[0]. Stránka na chvíli ukáže Načítám… a pak kartičku se slovem cat.
Přidejte stav chyba, na začátku prázdný text. Když je odpoved.ok rovno false, uložte do něj pomocí setChyba() text Slovíčka se nepodařilo načíst. a funkci ukončete pomocí return. Nad podmínkou pro null vraťte <p className="chyba">{chyba}</p>, když chyba není prázdná. Vyzkoušejte to: změňte název ve fetch() na slovickaa.json, tedy soubor, který neexistuje, spusťte kód a pak název vraťte zpátky.