В Preact, как и в чистом JavaScript, управление событиями строится на
обработчиках, назначаемых элементам через пропсы. Каждый обработчик
получает объект события, который является расширением стандартного
Event браузера, с дополнительными возможностями,
характерными для Preact. Управление всплытием и предотвращение действий
по умолчанию требует понимания этих объектов и методов их контроля.
Всплытие событий — процесс, при котором событие, инициированное на дочернем элементе, последовательно передается вверх по дереву DOM к родительским элементам. В Preact это поведение сохраняется, так как фреймворк использует синтетические события поверх нативного DOM.
import { h } from 'preact';
function Parent() {
const handleClick = () => {
console.log('Parent clicked');
};
return (
<div onCl ick={handleClick}>
<Child />
</div>
);
}
function Child() {
const handleClick = () => {
console.log('Child clicked');
};
return <button onCl ick={handleClick}>Click Me</button>;
}
При клике на кнопку сначала сработает обработчик Child,
затем Parent. Это демонстрирует стандартное всплытие
событий.
Для остановки всплытия используется метод
stopPropagation() объекта события:
function Child() {
const handleClick = (event) => {
event.stopPropagation();
console.log('Child clicked without bubbling');
};
return <button onCl ick={handleClick}>Click Me</button>;
}
В этом случае событие не достигнет родителя, и его обработчик вызван не будет.
Многие HTML-элементы имеют стандартное поведение: ссылки навигируют
по href, формы отправляют данные. Для предотвращения таких
действий используется метод preventDefault().
function Form() {
const handleSubmit = (event) => {
event.preventDefault();
console.log('Form submission prevented');
};
return (
<form onSub mit={handleSubmit}>
<button type="submit">Submit</button>
</form>
);
}
В данном примере форма не будет отправляться при клике на кнопку, но обработчик выполнится.
Часто требуется одновременно предотвратить стандартное действие и остановить всплытие:
function LinkButton() {
const handleClick = (event) => {
event.preventDefault();
event.stopPropagation();
console.log('Default action prevented and bubbling stopped');
};
return <a href="https://example.com" onCl ick={handleClick}>Go</a>;
}
Такой подход позволяет полностью контролировать поведение элемента в интерфейсе.
Preact применяет делегирование событий на уровне корневого контейнера приложения. Это означает, что обработчики событий прикрепляются не к каждому элементу напрямую, а к корню, и события распределяются по виртуальному дереву. Благодаря этому:
stopPropagation() и
preventDefault() работают так же, как в нативном DOM,
сохраняя предсказуемое поведение.stopPropagation(). Частое вмешательство в всплытие
может усложнять структуру приложения и нарушать ожидаемую работу других
компонентов.stopPropagation() и
preventDefault() доступны напрямую на объекте события,
аналогично чистому DOM, без необходимости дополнительного вызова
SyntheticEvent.Для закрытия модального окна по клику вне его области:
function Modal({ onClose }) {
const handleOverlayClick = (event) => {
event.stopPropagation();
onClose();
};
return (
<div className="overlay" onCl ick={handleOverlayClick}>
<div className="modal" onCl ick={(e) => e.stopPropagation()}>
<p>Modal Content</p>
</div>
</div>
);
}
Здесь клик по оверлею закрывает окно, но внутренние клики не вызывают
onClose, что предотвращает нежелательное всплытие.
function Checkbox({ onChange }) {
const handleClick = (event) => {
event.preventDefault();
onChange(event.target.checked);
};
return <input type="checkbox" onCl ick={handleClick} />;
}
Предотвращение стандартного поведения позволяет полностью контролировать состояние компонента через пропсы и внутреннюю логику.
stopPropagation() останавливает всплытие событий вверх
по дереву.preventDefault() отменяет стандартное поведение
элементов.Контролируя всплытие и действия по умолчанию, можно создавать гибкие и предсказуемые пользовательские интерфейсы с минимальными ресурсными затратами.