Projekt

Obecné

Profil

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>