Darbība ar input elementiem React
Darbība ar input elementiem React notiek ar
stāvokļu palīdzību. Katram input elementam tiek piešķirts savs
stāvoklis, kas satur input elementa value.
Apskatīsim piemērā. Pieņemsim, ka mums ir input elements:
function App() {
return <div>
<input />
</div>;
}
Pieņemsim arī, ka mums ir stāvoklis:
function App() {
const [value, setValue] = useState('text');
return <div>
<input />
</div>;
}
Piesēsim mūsu stāvokli pie input elementa value
atribūta:
function App() {
const [value, setValue] = useState('text');
return <div>
<input value={value} />
</div>;
}
Šajā gadījumā izrādīsies, ka mainoties stāvoklim, reaktīvi mainīsies arī input elementa teksts.
Tomēr tas rada interesantu blakusefektu:
tagad, palaižot kodu pārlūkprogrammā, input elementā
nav iespējams mainīt tekstu! Kāpēc: tāpēc
ka, ievadot tekstu input elementā, nemainās
stāvoklis value, attiecīgi, teksts
input elementā nevajadzētu mainīties.
Izmēģiniet pats. Nokopējiet manu kodu un palaidiet sevim. Mēģiniet mainīt tekstu input elementā - jums nekas neizdosies. Atveriet pārlūkprogrammas konsole - jūs tajā redzēsiet brīdinājumu no React. Šis brīdinājums norāda mums, ka mēs esam piesaistījuši stāvokli input elementam, bet tādējādi esam bloķējuši input elementu.
Padarīsim tā, lai mūsu input elementā varētu ievadīt tekstu. Lai to izdarītu, ir jāpanāk, lai, ievadot, mūsu stāvoklis mainītos uz input elementa pašreizējo vērtību.
Vispirms tam ir jāpievieno input elementam
notikums onChange:
function App() {
const [value, setValue] = useState('text');
return <div>
<input value={value} onChange={handleChange} />
</div>;
}
Šis notikums React uzvedas citādi salīdzinājumā ar tīro JS. React tas iedarbojas tūlīt pēc input elementa izmaiņām. Tas ir, ievadot vai dzēšot simbolu.
Tagad pievienosim mūsu notikuma apstrādātāju:
function App() {
const [value, setValue] = useState('text');
function handleChange() {
}
return <div>
<input value={value} onChange={handleChange} />
</div>;
}
Šajā apstrādātājā mums ir jānolasa pašreizējais
input elementa teksts un jāiestata tas stāvoklī, izmantojot
funkciju setValue.
Problēma ir tā, ka this šajā funkcijā
nerādīs uz mūsu input elementu - tāda ir
React īpatnība. Lai iegūtu elementu,
kurā notika notikums, mums ir jāizmanto
event.target:
function App() {
const [value, setValue] = useState('text');
function handleChange(event) {
console.log(event.target); // saite uz DOM input elementa
}
return <div>
<input value={value} onChange={handleChange} />
</div>;
}
Izvadīsim ar event.target palīdzību pašreizējo
input elementa tekstu:
function App() {
const [value, setValue] = useState('text');
function handleChange(event) {
console.log(event.target.value); // pašreizējais input elementa teksts
}
return <div>
<input value={value} onChange={handleChange} />
</div>;
}
Un tagad ierakstīsim input elementa tekstu mūsu stāvoklī:
function App() {
const [value, setValue] = useState('text');
function handleChange(event) {
setValue(event.target.value);
}
return <div>
<input value={value} onChange={handleChange} />
</div>;
}
Tagad mēs varēsim ievadīt tekstu input elementā.
Šajā gadījumā stāvoklis value vienmēr saturēs
input elementa pašreizējo tekstu.
Mēs to varam viegli pārbaudīt. Izvadīsim mūsu teksta saturu rindkopā. Šajā gadījumā, ievadot tekstu input elementā, ievadītais teksts automātiski parādīsies rindkopā:
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>;
}
Varam pārrakstīt uz kompaktāku variantu ar anonīmu bultiņu funkciju:
function App() {
const [value, setValue] = useState('');
return <div>
<input value={value} onChange={event => setValue(event.target.value)} />
<p>text: {value}</p>
</div>;
}
Tādējādi, lai jebkurš input elements darbotos, mums
vajag sekojošo: izveidot stāvokli šim
input elementam, piesaistīt stāvokli input elementa value
atribūtam, pievienot notikumu onChange input elementam,
notikuma apstrādātājā mainīt input elementa stāvokli
uz tā tekstu.
Šīs darbības būs jāveic ar katru
input elementu. Tas ir, ja jums ir divi input elementi,
tad jums būs divi stāvokļi un divas notikuma onChange apstrādātāja funkcijas.
Izveidojiet divus input elementus. Ļaujiet, lai pirmā input elementa teksts tiktu izvadīts pirmajā rindkopā, bet otrā input elementa teksts - otrajā rindkopā.