Делегирование событий — это техника управления событиями в веб-приложениях, позволяющая обрабатывать события на родительском элементе вместо назначения обработчиков на каждый дочерний элемент. В контексте фреймворка Inferno это особенно актуально, так как Inferno оптимизирован для высокой производительности и минимизации операций с DOM.
В стандартном JavaScript обработчики событий обычно назначаются на конкретные элементы:
const button = document.getElementById('myButton');
button.addEventListener('click', () => console.log('Нажата кнопка'));
При большом количестве элементов такой подход становится неэффективным: создаётся множество слушателей, каждый из которых потребляет память и ресурсы браузера. Делегирование позволяет назначить один обработчик на родительский элемент, который перехватывает события от всех потомков:
const container = document.getElementById('container');
container.addEventListener('click', (event) => {
if (event.target.tagName === 'BUTTON') {
console.log('Нажата кнопка', event.target.textContent);
}
});
Здесь событие click для всех кнопок обрабатывается одним
слушателем на контейнере.
Inferno использует собственную систему событий, которая строится на делегировании на уровне корня приложения. Все события в виртуальном DOM обрабатываются через один глобальный обработчик, что снижает нагрузку на браузер и ускоряет рендеринг.
import { render } from 'inferno';
import { Component } from 'inferno-component';
class ButtonList extends Component {
handleClick = (event) => {
const { target } = event;
if (target.tagName === 'BUTTON') {
console.log('Нажата кнопка:', target.textContent);
}
}
render() {
return (
<div onCl ick={this.handleClick}>
<button>Кнопка 1</button>
<button>Кнопка 2</button>
<button>Кнопка 3</button>
</div>
);
}
}
render(<ButtonList />, document.getElementById('app'));
В этом примере на контейнер div назначен один обработчик
onClick. События кнопок всплывают, и метод
handleClick определяет источник события через
event.target.
Меньше потребление памяти Один обработчик на родительском элементе заменяет множество слушателей на дочерних элементах.
Поддержка динамических элементов Новые элементы, добавленные в DOM после первоначальной отрисовки, автоматически подпадают под обработку событий без дополнительного назначения слушателей.
Упрощение кода Логика обработки централизована, легче управлять событиями, особенно когда элементов много.
click,
input, keydown и др.) и обеспечивает
кроссбраузерность.event.target
и использовать closest() для фильтрации событий, приходящих
не от нужного элемента:handleClick = (event) => {
const button = event.target.closest('button');
if (button) {
console.log('Нажата кнопка:', button.textContent);
}
}
В Inferno можно комбинировать делегирование с компонентной архитектурой. Родительский компонент может перехватывать события дочерних компонентов, обеспечивая единое управление.
class Parent extends Component {
handleChildClick = (event) => {
console.log('Событие от дочернего компонента:', event.target.textContent);
}
render() {
return (
<div onCl ick={this.handleChildClick}>
<Child label="Дочерний 1" />
<Child label="Дочерний 2" />
</div>
);
}
}
const Child = ({ label }) => <button>{label}</button>;
Такой подход облегчает тестирование и масштабирование приложений, снижает связанность компонентов и делает код более предсказуемым.
Делегирование событий в Inferno обеспечивает оптимальную производительность, простоту управления событиями и корректную работу с динамическими элементами. Использование централизованного подхода к событиям — один из ключевых приёмов при разработке высоконагруженных и интерактивных интерфейсов.