⊗jsrtPmFmsII 56 of 112 menu

Práca so vstupmi v React

Práca so vstupmi v React prebieha pomocou stavov. Každému vstupu je priradený vlastný stav, ktorý obsahuje jeho value.

Pozrime sa na príklad. Predpokladajme, že máme vstup:

function App() { return <div> <input /> </div>; }

Predpokladajme tiež, že máme stav:

function App() { const [value, setValue] = useState('text'); return <div> <input /> </div>; }

Pripojme náš stav k atribútu value vstupu:

function App() { const [value, setValue] = useState('text'); return <div> <input value={value} /> </div>; }

V takom prípade to znamená, že pri zmene stavu sa reaktívne zmení aj text vstupu.

To však má zaujímavý vedľajší efekt: teraz pri spustení kódu v prehliadači nie je možné zmeniť text vo vstupe! Prečo: pretože pri zadávaní textu do vstupu sa nemení stav value, a teda by sa text vo vstupe nemal meniť.

Vyskúšajte si to sami. Skopírujte môj kód a spustite si ho. Skúste meniť text vo vstupe - nič sa vám nepodarí. Otvorte konzolu prehliadača - uvidíte v nej varovanie React. Toto varovanie nám naznačuje, že sme pripojili stav k vstupu, ale tým sme zablokovali vstup.

Urobme to tak, aby bolo možné do nášho vstupu zadávať text. Na to je potrebné zabezpečiť, aby sa pri zadávaní menil náš stav na aktuálnu hodnotu vstupu.

Na začiatok je potrebné na vstup pripojiť udalosť onChange:

function App() { const [value, setValue] = useState('text'); return <div> <input value={value} onChange={handleChange} /> </div>; }

Táto udalosť v React sa správa inak v porovnaní s čistým JS. V React sa spúšťa okamžite po zmene vstupu. To znamená pri zadávaní alebo odstraňovaní symbolu.

Pridajme teraz obsluhu našej udalosti:

function App() { const [value, setValue] = useState('text'); function handleChange() { } return <div> <input value={value} onChange={handleChange} /> </div>; }

V tejto obsluhe musíme prečítať aktuálny text vstupu a nastaviť ho do stavu pomocou funkcie setValue.

Problém je v tom, že this tejto funkcie nebude ukazovať na náš vstup - to je zvláštnosť React. Ak chceme získať prvok, v ktorom sa udalosť stala, musíme použiť event.target:

function App() { const [value, setValue] = useState('text'); function handleChange(event) { console.log(event.target); // odkaz na DOM element vstupu } return <div> <input value={value} onChange={handleChange} /> </div>; }

Vypíšme pomocou event.target aktuálny text vstupu:

function App() { const [value, setValue] = useState('text'); function handleChange(event) { console.log(event.target.value); // aktuálny text vstupu } return <div> <input value={value} onChange={handleChange} /> </div>; }

A teraz zapíšme text vstupu do nášho stavu:

function App() { const [value, setValue] = useState('text'); function handleChange(event) { setValue(event.target.value); } return <div> <input value={value} onChange={handleChange} /> </div>; }

Teraz budeme môcť zadávať text do vstupu. Pri tom stav value bude vždy obsahovať aktuálny text vstupu.

Môžeme sa o tom ľahko presvedčiť. Vypíšme obsah nášho textu do odseku. V tomto prípade pri zadávaní textu do vstupu sa zadaný text automaticky objaví v odseku:

function App() { const [value, setValue] = useState(''); function handleChange(event) { setValue(event.target.value); } return <div> <input value={value} onChange={handleChange} /> <p>text: {value}</p> </div>; }

Môžeme to prepísať na kompaktnejšiu verziu s anonymnou funkciou so šípkou:

function App() { const [value, setValue] = useState(''); return <div> <input value={value} onChange={event => setValue(event.target.value)} /> <p>text: {value}</p> </div>; }

Pre prácu s akýmkoľvek vstupom teda potrebujeme nasledovné: vytvoriť stav pre tento vstup, pripojiť stav k atribútu value vstupu, pripojiť udalosť onChange na vstup, v obsluhe udalosti meniť stav vstupu na jeho text.

Tieto operácie je potrebné vykonať pre každý vstup. To znamená, že ak máte dva vstupy, budete mať dva stavy a dve funkcie na obsluhu udalosti onChange.

Vytvorte dva vstupy. Nech text prvého vstupu sa vypíše do prvého odseku a text druhého vstupu - do druhého odseku.

Slovenčina
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Používame cookies na fungovanie stránky, analýzu a personalizáciu. Spracúvanie údajov prebieha v súlade s Politikou ochrany osobných údajov.
prijať všetky nastaviť odmietnuť