Formular » Historie » Verze 3
Jiří Trefil, 2023-03-26 20:42
1 | 2 | Jiří Trefil | h1. Formulář |
---|---|---|---|
2 | |||
3 | Formuláře v HTML implikují úmysl odeslání dat někam dále (typicky na nějaký server). K samotnému odeslání nejsou nutně vyžadovány, ale je to good practice. |
||
4 | Následující code snippet obsahuje trochu složitější konstrukci - samostatné stránky, která poskytuje textový input a tlačítko, které odešle obsah inputu na server. |
||
5 | |||
6 | <pre><code class="react"> |
||
7 | 3 | Jiří Trefil | //import reactu |
8 | 2 | Jiří Trefil | import React from "react"; |
9 | 3 | Jiří Trefil | //import hooku z knihovny |
10 | 2 | Jiří Trefil | import {useState, useEffect} from "react"; |
11 | 3 | Jiří Trefil | //nacteni funkce ze service, ktera vola endpoint serveru |
12 | //samotny fetch na server a komponenta oddelena - dobra konvence |
||
13 | 2 | Jiří Trefil | import requestDocuments from "../../api/SearchAPI"; |
14 | 3 | Jiří Trefil | //import samotnych komponent |
15 | 2 | Jiří Trefil | import SearchBar from "../../components/SearchBar"; |
16 | import Button from "../../components/Button"; |
||
17 | import List from "../../components/List"; |
||
18 | 3 | Jiří Trefil | //import vlastniho datoveho typu (rozhrani) |
19 | 2 | Jiří Trefil | import {ArticleListItems} from "../../lib/global/datatypes"; |
20 | |||
21 | const Search = () => { |
||
22 | //vlastni funkce, ktera se zavola pri odeslani formulare |
||
23 | //event.preventDefault() je dulezity, jinak dojde k redirectu tam, kam formular ukazuje |
||
24 | //v tomto pripade neukazuje "nikam" - provede se refresh stranky, to urcite neni chtene chovani |
||
25 | const fetchSearchResults = async (event:React.FormEvent) =>{ |
||
26 | event.preventDefault(); |
||
27 | const res = await requestDocuments(searchQuery); |
||
28 | setDocuments(res); |
||
29 | setLoaded(true); |
||
30 | } |
||
31 | //react hook |
||
32 | useEffect(()=>{ |
||
33 | //V tomto pripade neni nutne tento hook pouzit, protoze odesilany formular vyvolava fetch na server |
||
34 | //ale je zde mozne napsat nejakou logiku - napriklad vykreslit progress bar |
||
35 | //mirne snizime vykon aplikace, ale radikalne zvysime UX |
||
36 | console.log(retrievedDocuments); |
||
37 | }); |
||
38 | //samotny stav komponent - perzistentni uloziste v ramci zivotniho cyklu komponenty |
||
39 | //co tato syntaxe semanticky rika - vytvor promennou searchQuery a funkce setSearchQuery, ktera nastavi hodnotu teto |
||
40 | //promenne |
||
41 | // useState("") - defaultni hodnota promenne searchQuery je nic (undefined) |
||
42 | //tato syntaxe neni typescriptova - je mozne ji pouzit, ale vhodnejsi je konstrukce nize |
||
43 | const [searchQuery, setSearchQuery] = useState(""); |
||
44 | //Ekvivalent konstrukce vyse, pouze je zde zanesen vlastni datovy typ ArticleListItems |
||
45 | //tim tedy deklarujeme, ze promenna retrievedDocuments je typu ArticleListItems |
||
46 | const [retrievedDocuments, setDocuments] = useState<ArticleListItems|undefined>(); |
||
47 | const [loaded,setLoaded] = useState(false); |
||
48 | |||
49 | //id inputu |
||
50 | const containerId: string = "search-bar-form"; |
||
51 | //vykresli celou stranku tvorenou komponentami |
||
52 | return( |
||
53 | <div className={"container"}> |
||
54 | <div id={"search-bar-container"}> |
||
55 | <h1 className={"subtitle"}>Vyhledejte informaci</h1> |
||
56 | //kdyz je odeslan formular, tak zavolam vlastni funkci - fetchSearchResults |
||
57 | <form onSubmit={fetchSearchResults}> |
||
58 | //pouziti komponent pro vytvoreni obsahuje stranky |
||
59 | // a predavani vlastnosti komponenty (containerId, query, setQuery) |
||
60 | //dobre pravidlo v reactu - callbacky predavame shora dolu (tedy od rodice detem) |
||
61 | // a eventy bublaji zdola nahoru (tedy v potomky nastane udalost a potomek zavola predany callback) |
||
62 | <SearchBar containerId={containerId} query={searchQuery} setQuery={setSearchQuery}/> |
||
63 | <Button className={"button button-submit"} id={"submit_button"} text={"Vyhledat dokumenty"}/> |
||
64 | </form> |
||
65 | //podminene vykresleni komponenty - pokud mam nactena data, tak vykresli komponentu List |
||
66 | //jinak ne |
||
67 | {loaded && <List articles={retrievedDocuments?.articles}/>} |
||
68 | </div> |
||
69 | </div> |
||
70 | ) |
||
71 | } |
||
72 | export default Search; |
||
73 | |||
74 | </pre></code> |