Делегирование событий — это техника управления событиями, при которой один обработчик прикрепляется к родительскому элементу и перехватывает события, происходящие на его дочерних элементах. В Preact, как и в React, делегирование событий встроено в ядро фреймворка. Это позволяет оптимизировать производительность и упрощает работу с динамически изменяемыми элементами.
Централизация обработчиков В Preact события регистрируются на верхнем уровне виртуального DOM, обычно на корневом элементе, и распространяются вниз по дереву через систему синтетических событий. Это означает, что даже если добавлять или удалять компоненты, нет необходимости вручную навешивать или снимать обработчики с каждого дочернего элемента.
Синтетические события Preact использует систему синтетических событий, которая оборачивает нативные события браузера. Основные преимущества синтетических событий:
События на функциональных компонентах Делегирование работает одинаково на функциональных и классовых компонентах. Обработчики прикрепляются через JSX-синтаксис:
function List({ items }) {
const handleClick = (event) => {
console.log('Clicked:', event.target.dataset.id);
};
return (
<ul onCl ick={handleClick}>
{items.map(item => (
<li key={item.id} data-id={item.id}>{item.name}</li>
))}
</ul>
);
}
В этом примере один обработчик handleClick управляет
кликами для всех элементов списка. Использование атрибута
data-id позволяет идентифицировать, на каком элементе
произошло событие.
События вне виртуального DOM Делегирование
работает только для элементов, управляемых Preact. События на элементах,
созданных вручную через document.createElement, не будут
автоматически перехватываться.
Особенности нативных событий Некоторые
специфические события, такие как focus и blur,
не всплывают. Для их обработки используется синтетический подход через
обработчики Preact (onFocus, onBlur), которые
имитируют всплытие.
Всплытие и предотвращение распространения
event.stopPropagation() работает так же, как в обычном DOM.
Однако важно учитывать, что Preact сначала вызывает синтетический
обработчик, а затем, при необходимости, оригинальный нативный.
useCallback,
чтобы избежать лишних пересозданий функций.data-* или
id для идентификации элементов внутри делегированного
обработчика.function TodoList({ todos }) {
const handleClick = (event) => {
const id = event.target.dataset.id;
if (!id) return;
console.log('Todo clicked:', id);
};
return (
<div onCl ick={handleClick}>
{todos.map(todo => (
<div key={todo.id} data-id={todo.id}>
{todo.text}
</div>
))}
</div>
);
}
В этом примере один обработчик управляет кликами для всех задач.
Использование data-id позволяет фильтровать клики, исключая
клики по пустым областям контейнера.
Делегирование тесно связано с хуками:
import { useRef, useEffect } from 'preact/hooks';
function ClickTracker() {
const containerRef = useRef();
useEffect(() => {
const container = containerRef.current;
const logClick = (e) => console.log('Native click:', e.target);
container.addEventListener('click', logClick);
return () => container.removeEventListener('click', logClick);
}, []);
return (
<div ref={containerRef}>
<button>Click me</button>
</div>
);
}
Здесь показана интеграция делегирования Preact с нативными событиями для специфических случаев.
Делегирование событий в Preact позволяет создавать эффективные и легко поддерживаемые интерфейсы, особенно в приложениях с большим количеством динамических элементов. Синтетическая система событий обеспечивает кроссбраузерную совместимость, упрощает обработку всплытия и дает централизованный контроль над событиями.