Nell'ordine degli eventi DOM: CATTURA vs BUBBLING
Esistono due fasi per la propagazione degli eventi. Questi sono chiamati "cattura" e "bolle" .
| | / \
---------------| |----------------- ---------------| |-----------------
| element1 | | | | element1 | | |
| -----------| |----------- | | -----------| |----------- |
| |element2 \ / | | | |element2 | | | |
| ------------------------- | | ------------------------- |
| Event CAPTURING | | Event BUBBLING |
----------------------------------- -----------------------------------
La fase di cattura avviene per prima, e poi è seguita dalla fase di ribollimento. Quando registri un evento utilizzando la normale API DOM, gli eventi faranno parte della fase di bubbling per impostazione predefinita, ma questo può essere specificato al momento della creazione dell'evento
// CAPTURING event
button.addEventListener('click', handleClick, true)
// BUBBLING events
button.addEventListener('click', handleClick, false)
button.addEventListener('click', handleClick)
In React, anche gli eventi di bubbling sono ciò che usi per impostazione predefinita.
// handleClick is a BUBBLING (synthetic) event
<button onClick={handleClick}></button>
// handleClick is a CAPTURING (synthetic) event
<button onClickCapture={handleClick}></button>
Diamo un'occhiata all'interno del nostro handleClick callback (React):
function handleClick(e) {
// This will prevent any synthetic events from firing after this one
e.stopPropagation()
}
function handleClick(e) {
// This will set e.defaultPrevented to true
// (for all synthetic events firing after this one)
e.preventDefault()
}
Un'alternativa che non ho visto menzionata qui
Se chiami e.preventDefault () in tutti i tuoi eventi, puoi controllare se un evento è già stato gestito e impedire che venga gestito di nuovo:
handleEvent(e) {
if (e.defaultPrevented) return // Exits here if event has been handled
e.preventDefault()
// Perform whatever you need to here.
}
Per la differenza tra eventi sintetici ed eventi nativi, vedere la documentazione di React: https://reactjs.org/docs/events.html