Theo thứ tự của các sự kiện DOM: CAPTURING và BUBBLING
Có hai giai đoạn cho cách sự kiện lan truyền. Chúng được gọi là "bắt" và "sủi bọt" .
| | / \
---------------| |----------------- ---------------| |-----------------
| element1 | | | | element1 | | |
| -----------| |----------- | | -----------| |----------- |
| |element2 \ / | | | |element2 | | | |
| ------------------------- | | ------------------------- |
| Event CAPTURING | | Event BUBBLING |
----------------------------------- -----------------------------------
Giai đoạn bắt mồi xảy ra đầu tiên, sau đó là giai đoạn sủi bọt. Khi bạn đăng ký một sự kiện bằng api DOM thông thường, các sự kiện sẽ là một phần của giai đoạn sôi nổi theo mặc định, nhưng điều này có thể được chỉ định khi tạo sự kiện
// CAPTURING event
button.addEventListener('click', handleClick, true)
// BUBBLING events
button.addEventListener('click', handleClick, false)
button.addEventListener('click', handleClick)
Trong React, các sự kiện nổi bọt cũng là những gì bạn sử dụng theo mặc định.
// handleClick is a BUBBLING (synthetic) event
<button onClick={handleClick}></button>
// handleClick is a CAPTURING (synthetic) event
<button onClickCapture={handleClick}></button>
Hãy xem bên trong lệnh gọi lại handleClick (React) của chúng tôi:
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()
}
Một giải pháp thay thế mà tôi chưa thấy đề cập ở đây
Nếu bạn gọi e.preventDefault () trong tất cả các sự kiện của mình, bạn có thể kiểm tra xem một sự kiện đã được xử lý chưa và ngăn sự kiện đó bị xử lý lại:
handleEvent(e) {
if (e.defaultPrevented) return // Exits here if event has been handled
e.preventDefault()
// Perform whatever you need to here.
}
Để biết sự khác biệt giữa sự kiện tổng hợp và sự kiện gốc, hãy xem tài liệu React: https://reactjs.org/docs/events.html