Pokračujeme s aplikací Úkolníček, ve které jsme v předchozím cvičení vytvořili komponenty Item a List
Komponenta Form
Nyní potřebujeme v aplikaci vytvořit formulář, kam půjde zadat nový úkol, který chceme přidat do seznamu.
-
Vytvoř novou komponentu
Form. Komponenta zatím nebude mít žádné props, ale přidáme je později. Komponentu rovnou naimportuj a použij vApp, abys v dalších krocích viděla, jak tvůj formulář vypadá. -
V komponentě vytvoř formulář pomocí značky
<form>a dovnitř přidej následující formulářové prvky:<input type="text" name="title" />pro zadání názvu úkolu<textarea name="description" />pro zadání popisu úkolu<button type="submit">Přidat</button>jako odesílací tlačítko
K prvkům přidej label s popiskem polí a ostatní náležitosti, které má přístupný formulář splňovat.
-
V komponentě založ funkci
handleSubmita nastavit ji, aby se volala při odeslání formuláře (událostonSubmit). -
Ve funkci budeš potřebovat event object, abys mohla zabránit výchozí akci prohlížeče pomocí
e.preventDefault(). To znamená, že tvoje funkce musí přijímat parametrea ty mu musíš nastavit správný typ podle toho, jakou událost popisuje (tj. odeslání formuláře). -
Za
e.preventDefault()přidej zatím jenconsole.log('odeslano')a vyzkoušej, že po odeslání formuláře nedojde k obnovení stránky a že se v konzoli objeví text "odesláno".
Stav pro formulářová pole
Hodnoty z formuláře chceme uložit do stavu, abychom při psaní do políček ve formuláři měli ve stavu vždy aktuální hodnoty.
-
Naimportuj z Reactu
useStatea vytvoř pomocí něj nový stav, který se bude jmenovatformData. Ve stavu bude uložený objekt, jehož vlastnosti se budou jmenovat stejně jako políčka ve formuláři. V našem případě to bude:{ title: '', description: '', } -
Správně bychom měli nadefinovat typ pro hodnotu, kterou budeme do stavu ukládat. Vytvoř interface s názvem
FormDataStructure, který bude popisovat vlastnosti zmíněné v bodě 1. -
Přidej vytvořený datový typ k
useStatetímto způsobem:const [formData, setFormData] = useState<FormDataStructure>({ title: '', description: '', }) -
K oběma formulářovým polím přidej atribut
valuea nastav mu příslušnou hodnotu ze stavu. Aby se hodnoty uložené ve stavu propsaly do políček formuláře. -
Vytvoř v komponentě funkci
handleChange, se bude volat jako reakce na událostonChangeu obou formulářových polí. -
V komponentě budeš potřebovat event object a musíš mu nastavit správný typ. Protože se funkce volá jako reakce na událost
onChangeu prvku<input>a také prvku<textarea>, půjde o složený typ. -
Zařiď, aby se hodnota formulářového pole zapsala do adekvátní vlastnosti objektu uloženého ve stavu
formData.Název prvku, který událost vyvolal, budeš mít v
e.target.name, a hodnotu formulářového pole ve.target.value.Vzpomeň si, že k vlastnostem objektů můžeš přistupovat nejen pomocí tečky
objekt.vlastnost, ale také pomocí hranatých závorekobjekt['vlastnost']. -
Do funkce
handleSubmit, která se volá při odeslání formuláře, doplňconsole.log, který vypíše obsah stavuformDatado konzole. Ověř si, že když do formuláře něco vyplníš a formulář odešleš, objeví se ti v konzoli prohlížeče správné hodnoty.
Bonus
Pokud se nudíš...
- Přidej do formuláře ještě roletku (select) nazvanou
priority, ve které půjdou vybrat možnosti low, normal a high. Standardně bude vybraná možnost normal. - Uprav adekvátně i stav, kam se hodnota z roletky ukládá, a propoj stav s formulářovým prvkem.
- Vrať se k předchozím komponentám
ItemaLista obě uprav je tak, aby počítaly s tím, že každý úkol má nyní také nastavenou prioritu. - V komponentě
Itemzařiď, aby se u názvu úkolu objevila:- modrá šipka
↓pro nízkou prioritu - červená dvojšipka
↑↑pro vysokou prioritu - u úkolů s normální prioritou se nezobrazuje nic
- modrá šipka