Projekt

Obecné

Profil

Formular » Historie » Verze 2

Jiří Trefil, 2023-03-26 20:40

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
import React from "react";
8
import {useState, useEffect} from "react";
9
import requestDocuments from "../../api/SearchAPI";
10
import SearchBar from "../../components/SearchBar";
11
import Button from "../../components/Button";
12
import List from "../../components/List";
13
import {ArticleListItems} from "../../lib/global/datatypes";
14
15
const Search = () => {
16
    //vlastni funkce, ktera se zavola pri odeslani formulare
17
    //event.preventDefault() je dulezity, jinak dojde k redirectu tam, kam formular ukazuje
18
    //v tomto pripade neukazuje "nikam" - provede se refresh stranky, to urcite neni chtene chovani
19
    const fetchSearchResults = async (event:React.FormEvent) =>{
20
        event.preventDefault();
21
        const res = await requestDocuments(searchQuery);
22
        setDocuments(res);
23
        setLoaded(true);
24
    }
25
    //react hook
26
    useEffect(()=>{
27
        //V tomto pripade neni nutne tento hook pouzit, protoze odesilany formular vyvolava fetch na server
28
        //ale je zde mozne napsat nejakou logiku - napriklad vykreslit progress bar
29
        //mirne snizime vykon aplikace, ale radikalne zvysime UX
30
        console.log(retrievedDocuments);
31
    });
32
    //samotny stav komponent - perzistentni uloziste v ramci zivotniho cyklu komponenty
33
    //co tato syntaxe semanticky rika - vytvor promennou searchQuery a funkce setSearchQuery, ktera nastavi hodnotu teto
34
    //promenne
35
    // useState("") - defaultni hodnota promenne searchQuery je nic (undefined)
36
    //tato syntaxe neni typescriptova - je mozne ji pouzit, ale vhodnejsi je konstrukce nize
37
    const [searchQuery, setSearchQuery] = useState("");
38
    //Ekvivalent konstrukce vyse, pouze je zde zanesen vlastni datovy typ ArticleListItems
39
    //tim tedy deklarujeme, ze promenna retrievedDocuments je typu ArticleListItems
40
    const [retrievedDocuments, setDocuments] = useState<ArticleListItems|undefined>();
41
    const [loaded,setLoaded] = useState(false);
42
43
    //id inputu
44
    const containerId: string = "search-bar-form";
45
    //vykresli celou stranku tvorenou komponentami
46
        return(
47
        <div className={"container"}>
48
            <div id={"search-bar-container"}>
49
                <h1 className={"subtitle"}>Vyhledejte informaci</h1>
50
                //kdyz je odeslan formular, tak zavolam vlastni funkci - fetchSearchResults
51
                <form onSubmit={fetchSearchResults}>
52
                    //pouziti komponent pro vytvoreni obsahuje stranky
53
                    // a predavani vlastnosti komponenty (containerId, query, setQuery)
54
                    //dobre pravidlo v reactu - callbacky predavame shora dolu (tedy od rodice detem)
55
                    // a eventy bublaji zdola nahoru (tedy v potomky nastane udalost a potomek zavola predany callback)
56
                    <SearchBar containerId={containerId} query={searchQuery} setQuery={setSearchQuery}/>
57
                    <Button className={"button button-submit"} id={"submit_button"} text={"Vyhledat dokumenty"}/>
58
                </form>
59
                //podminene vykresleni komponenty - pokud mam nactena data, tak vykresli komponentu List
60
                //jinak ne
61
                {loaded && <List articles={retrievedDocuments?.articles}/>}
62
            </div>
63
        </div>
64
    )
65
}
66
export default Search;
67
68
</pre></code>