Библиотека Atomico предоставляет удобный и гибкий способ работы с
компонентами Web Components через функции, напоминающие React-хуки.
Одним из ключевых инструментов для взаимодействия с событиями является
хук useEvent. Он позволяет подписываться на события DOM и
управлять их обработкой с минимальным количеством кода.
useEventХук useEvent импортируется напрямую из Atomico:
import { useEvent, c, html } from "atomico";
Простейший пример подписки на событие клика:
function Button() {
const handleClick = useEvent("click", event => {
console.log("Кнопка нажата", event);
});
return html`
<button ${handleClick}>Нажми меня</button>
`;
}
Ключевые моменты:
useEvent — имя
события, которое нужно слушать.event.${handleClick}. Это позволяет избежать
ручного добавления addEventListener и
removeEventListener.useEvent поддерживает вторую сигнатуру с объектом
настроек, аналогично параметрам addEventListener:
const handleClick = useEvent(
"click",
event => console.log("Click with capture", event),
{ capture: true, passive: true }
);
Опции, которые можно использовать:
capture — прослушивание события на фазе захвата.passive — сообщает браузеру, что обработчик не вызывает
preventDefault(), улучшает производительность скролла.once — обработчик сработает один раз.Atomico активно поддерживает собственные события компонентов. Например, можно подписаться на событие, эмитируемое дочерним компонентом:
function Child() {
return html`
<button
oncl ick=${useEvent("custom", e => console.log("Child event", e))}
>
Emit Event
</button>
`;
}
function Parent() {
const handleCustom = useEvent("custom", e => console.log("Parent caught", e));
return html`
<child-component ${handleCustom}></child-component>
`;
}
Особенности работы с кастомными событиями:
dispatchEvent.useEvent позволяет «подписываться» на события как
стандартные DOM-события.CustomEvent с полем
detail.Пример эмита события из дочернего компонента:
this.dispatchEvent(new CustomEvent("custom", { detail: { value: 42 } }));
Хук useEvent поддерживает динамическое изменение
обработчиков:
const [count, setCount] = useState(0);
const handleClick = useEvent("click", event => {
console.log("Счётчик", count);
});
return html`<button ${handleClick}>Click me</button>`;
При каждом рендере хук автоматически обновляет привязку к элементу, чтобы использовать актуальные значения из замыкания, что упрощает работу со стейтом.
useRef и ссылками на элементыuseEvent может использоваться совместно с ссылками для
подписки на события конкретного элемента:
const buttonRef = useRef();
useEvent(buttonRef, "click", event => {
console.log("Clicked button via ref", event);
});
return html`<button ref=${buttonRef}>Click me</button>`;
Такой подход полезен, когда элемент создаётся динамически или требуется более точный контроль.
Возможна подписка на несколько событий через массив:
const handleEvents = useEvent(["mouseenter", "mouseleave"], event => {
console.log("Событие мыши:", event.type);
});
passive: true для событий скролла и
тач-событий.useEvent с
useCallback для оптимизации повторного рендера.useEvent поддерживает подписку на события
window и document:
const handleResize = useEvent(window, "resize", event => {
console.log("Размер окна изменён", window.innerWidth);
});
useEvent гарантирует корректное удаление обработчиков
при размонтировании элемента или компонента. Это исключает утечки памяти
и обеспечивает стабильность приложения.
${handleEvent} или реф.useEvent в Atomico представляет собой мощный инструмент
для работы с событиями, обеспечивающий безопасное, удобное и
декларативное подключение обработчиков, как для стандартных DOM-событий,
так и для кастомных событий компонентов. Его гибкость позволяет
создавать интерактивные компоненты без избыточного кода и ошибок
управления жизненным циклом событий.