React gestisce gli eventi con props che prendono il nome dall'evento in camelCase, come onClick, onChange e onSubmit. Passi una funzione, e React la chiama con un oggetto evento quando l'utente clicca, scrive o invia.
Ogni clic esegue handleClick, che aggiorna il conteggio e scrive nella console sotto l'anteprima. Prova onDoubleClick al posto di onClick: ora conta solo il doppio clic.
Passa la funzione, non chiamarla
La prop riceve una funzione, e React la chiama più tardi. Un errore molto comune è aggiungere le parentesi, che chiamano subito la funzione, durante il rendering, e consegnano a React il suo valore restituito.
La console mostra "Hi, during render" prima ancora che tu tocchi qualcosa: React ha eseguito sayHi mentre renderizzava il primo pulsante, e poiché sayHi restituisce undefined, quel pulsante non ha alcun gestore. Cliccare Wrong non fa nulla. Cliccare Right scrive "Hi, Ada", perché la arrow function viene eseguita solo al clic.
La arrow è anche il modo per passare argomenti. onClick={() => removeItem(item.id)} crea una piccola funzione per ogni voce, e quella funzione chiama la tua con l'ID giusto. Se un gestore non accetta argomenti, passalo per nome: onClick={handleClick}.
Con un setter di stato l'errore è peggiore: onClick={setCount(count + 1)} imposta lo stato durante il rendering, che provoca un nuovo render, che imposta di nuovo lo stato, e React si ferma con "Too many re-renders".
L'oggetto evento
React passa a ogni gestore un argomento, l'oggetto evento. Ha le stesse proprietà dell'evento del browser: e.target è l'elemento su cui è avvenuto l'evento, e.key è il tasto premuto, e.preventDefault() annulla l'azione predefinita del browser. React racchiude l'evento nativo in quello che chiama synthetic event, così si comporta allo stesso modo in ogni browser; l'originale si trova in e.nativeEvent se mai ti servisse.
I due che userai di più sono e.target.value in onChange ed e.key in onKeyDown.
Scrivi hooks e premi Invio: il tag viene aggiunto e il campo si svuota. La console registra ogni tasto, inclusi Shift, Backspace ed Enter, con i nomi che compaiono in e.key. Premi Esc a metà di una parola per scartarla.
L'onChange di React scatta a ogni tasto. In HTML semplice l'evento change su un campo di testo scatta solo quando perde il focus, quindi questa è una differenza voluta: permette all'input e allo stato di procedere di pari passo, lettera per lettera. Le checkbox ti danno e.target.checked invece di value. La pagina sui form tratta ogni tipo di input.
Form e preventDefault
Quando un form viene inviato, l'azione predefinita del browser è spedirlo e caricare una nuova pagina. In un'app React quasi sempre vuoi gestire i dati da te, quindi il gestore di invio inizia con e.preventDefault().
Metti onSubmit sul <form>, non onClick sul pulsante: così anche premere Invio nel campo invia il form, e i controlli del browser (qui required e type="email") vengono eseguiti per primi. Elimina la riga e.preventDefault() e invia di nuovo: una pagina reale ora passerebbe a una nuova pagina e perderebbe il messaggio di ringraziamento. L'anteprima lo blocca e mostra invece cosa invierebbe il form, email= senza valore, perché setEmail('') aveva già svuotato il campo quando il form è stato letto.
React 19 ti permette anche di passare una funzione a <form action={fn}>, che riceve i dati del form e azzera per te i campi non controllati. La pagina sui form mostra entrambi gli stili.
Bubbling e stopPropagation
La maggior parte degli eventi risale (bubbling): dopo essere stati eseguiti sull'elemento che hai cliccato, vengono eseguiti sul suo genitore, poi sul genitore del genitore, fino in cima. I gestori React seguono lo stesso ordine. È per questo che un clic su un pulsante dentro una card cliccabile conta anche come clic sulla card.
Clicca Bubbles up e la console registra il pulsante, poi il pannello interno, poi la card esterna. Clicca Stops here e viene registrato solo il pulsante: e.stopPropagation() interrompe la risalita. Cliccare il testo del pannello interno registra il pannello e la card.
Usa stopPropagation con parsimonia. Un caso legittimo comune è un pulsante di eliminazione dentro una riga di lista cliccabile, dove cliccare elimina non dovrebbe anche aprire la riga. Se un genitore deve sapere se il clic è arrivato da un figlio, controlla e.target invece di fermare l'evento. Per eseguire invece un gestore durante la discesa, prima che i figli vedano l'evento, React offre le versioni di cattura come onClickCapture.
preventDefault e stopPropagation sono strumenti diversi. Il primo annulla ciò che farebbe il browser (seguire un link, inviare un form, spuntare una checkbox). Il secondo impedisce agli altri gestori di venire a sapere dell'evento. Chiamarne uno non fa l'altro.
Altri eventi comuni
Lo stesso schema copre ogni evento supportato da React. Alcuni che userai spesso:
onFocuseonBlurscattano quando un input ottiene e perde il focus, utili per mostrare la validazione dopo che l'utente lascia un campo.onMouseEntereonMouseLeavescattano quando il puntatore entra in un elemento e ne esce. A differenza della maggior parte degli eventi non risalgono, quindi spostare il puntatore da un genitore a un suo figlio non fa scattare di nuovo l'onMouseEnterdel genitore.onPointerDown,onPointerMoveeonPointerUpfunzionano allo stesso modo per mouse, touch e penna, il che li rende la scelta migliore per il trascinamento.onScrollscatta mentre un elemento scorre. In React non risale.
Ogni gestore riceve un oggetto evento con le proprietà che hanno senso per lui: e.clientX per gli eventi del puntatore, e.key per quelli della tastiera, e.target per tutti.
Passare gestori come props
I componenti possono accettare gestori dal loro genitore come qualsiasi altra prop. Chiamali onSomething in base a ciò che è successo, e chiama la funzione che lo gestisce handleSomething. Questo rispecchia gli eventi integrati e rende evidente quali props sono callback.
Stepper non possiede il numero; segnala i clic e il genitore decide cosa significano. Cambia handleDecrement in modo che si fermi a 1 invece che a 0 e lo stepper si adegua senza essere modificato. Tenere lo stato nel genitore e passare i gestori verso il basso è lo schema descritto in sollevare lo stato.
Le props di gestori personalizzate sono solo nomi. onIncrement sul tuo componente non fa nulla finché il componente non lo passa all'onClick di un elemento reale, e puoi dargli gli argomenti che vuoi, per esempio onSelect(item.id).
Domande frequenti
Come passo un parametro a un gestore onClick?
Racchiudi la chiamata in una arrow function: onClick={() => deleteItem(item.id)}. La arrow è ciò che React chiama al clic, e a sua volta chiama la tua funzione con l'argomento.
Perché il mio onClick si esegue al caricamento della pagina?
Hai chiamato la funzione invece di passarla. onClick={handleClick()} esegue handleClick durante il rendering e passa il suo valore restituito. Scrivi onClick={handleClick} oppure onClick={() => handleClick(id)}.
Qual è la differenza tra onChange in React e in HTML?
In HTML l'evento change su un input di testo scatta quando l'input perde il focus. L'onChange di React scatta a ogni tasto, come l'evento nativo input, così lo stato può seguire il testo mentre viene digitato.
Come impedisco a un form di ricaricare la pagina in React?
Chiama e.preventDefault() all'inizio del gestore onSubmit. Metti il gestore sul <form>, non sul pulsante di invio, così anche premere Invio in un campo invia il form.
Cos'è un synthetic event in React?
È l'oggetto evento che React passa ai tuoi gestori. Racchiude l'evento nativo del browser con le stesse proprietà e metodi (target, key, preventDefault(), stopPropagation()) e si comporta allo stesso modo in tutti i browser. L'originale è disponibile come e.nativeEvent.