Preact использует модель синтетических событий, аналогичную той, что применяется в React. Это означает, что события, привязанные к компонентам, обрабатываются единым механизмом, который нормализует поведение событий в разных браузерах и упрощает управление ими.
События в Preact инкапсулируются в объекты типа
SyntheticEvent. Эти объекты:
click, input, keydown и
др.).preventDefault() и
stopPropagation() для управления поведением событий.Синтетические события создаются автоматически при использовании JSX и
привязке обработчиков через атрибуты вида onClick,
onInput, onChange.
import { h } from 'preact';
function Button() {
const handleClick = (event) => {
event.preventDefault();
console.log('Клик по кнопке', event);
};
return <button onCl ick={handleClick}>Нажми меня</button>;
}
В примере выше handleClick получает объект
SyntheticEvent, который предоставляет доступ к свойствам
оригинального события (event.target,
event.type и т. д.), а также позволяет предотвращать
стандартное поведение и останавливать всплытие.
Всплытие и делегирование Все синтетические события в Preact делегируются на корневой элемент приложения. Это уменьшает количество отдельных обработчиков в DOM и повышает производительность.
Реальный DOM Объект SyntheticEvent
содержит ссылку на оригинальное DOM-событие через свойство
nativeEvent. Это позволяет при необходимости использовать
стандартные методы работы с DOM.
Поведение после асинхронных операций В Preact синтетические события повторно используют объекты для экономии памяти. После завершения обработчика свойства события могут быть очищены. Чтобы сохранить данные для асинхронной обработки, требуется копировать нужные значения:
function InputLogger() {
const handleChange = (event) => {
const value = event.target.value; // сохраняем значение
setTimeout(() => {
console.log('Асинхронное значение:', value);
}, 1000);
};
return <input onIn put={handleChange} />;
}
<input
onFo cus={(e) => console.log('Фокус', e)}
onB lur={(e) => console.log('Сброс фокуса', e)}
/>
SyntheticEvent переиспользуются, снижая нагрузку на сборщик
мусора.Синтетические события упрощают управление формами:
function FormExample() {
const handleSubmit = (event) => {
event.preventDefault();
console.log('Форма отправлена', event.target.elements);
};
return (
<form onSub mit={handleSubmit}>
<input name="username" />
<button type="submit">Отправить</button>
</form>
);
}
Все элементы формы можно безопасно использовать через
event.target, при этом всплытие контролируется стандартными
методами SyntheticEvent.
Preact позволяет перехватывать события на родительских компонентах, используя стандартное всплытие:
function Parent() {
const handleClick = (e) => {
console.log('Событие на родителе');
};
return (
<div onCl ick={handleClick}>
<Child />
</div>
);
}
function Child() {
return <button>Кнопка</button>;
}
Даже если клик произошёл на кнопке, обработчик родителя сработает благодаря делегированию синтетического события.
При работе с хуками useState важно учитывать, что
синтетические события могут быть уже очищены в асинхронных функциях.
Необходимо сохранять значения из события до вызова асинхронного
кода:
import { h } from 'preact';
import { useState } from 'preact/hooks';
function AsyncInput() {
const [text, setText] = useState('');
const handleChange = (event) => {
const value = event.target.value;
setTimeout(() => setText(value), 500);
};
return <input value={text} onIn put={handleChange} />;
}
Это предотвращает потерю данных и обеспечивает корректное обновление состояния.
Синтетические события в Preact предоставляют мощный и
оптимизированный инструмент для работы с пользовательским вводом. Их
делегирование, нормализация и повторное использование объектов делают
управление событиями более производительным, а единый интерфейс
позволяет писать кроссбраузерный код без лишних проверок. Грамотное
использование SyntheticEvent обеспечивает надежное
управление формами, асинхронными операциями и компонентной
иерархией.