Делегирование событий является ключевым инструментом для управления поведением компонентов в SkateJS. Эта техника позволяет обрабатывать события не на каждом элементе отдельно, а централизованно на родительском компоненте, экономя ресурсы и упрощая архитектуру приложения.
В SkateJS делегирование событий строится на двух базовых концепциях:
Событие всплывает до родителя. Любое стандартное
DOM-событие, например click, input или
change, автоматически всплывает по дереву DOM до ближайшего
родителя. SkateJS использует этот механизм для привязки обработчиков на
уровне компонента, а не отдельных элементов.
Фильтрация по селектору. Делегирование работает
через проверку целевого элемента события (event.target) на
соответствие определённому селектору. Это позволяет обрабатывать клики,
ввод и другие действия только для нужных элементов, не создавая
обработчик для каждого из них.
eventsSkateJS предоставляет возможность описывать события в компоненте
через статическое свойство events:
import { define, Component, h } from 'skatejs';
class MyComponent extends Component {
static get is() { return 'my-component'; }
static get events() {
return {
'click button': 'onButtonClick',
'input .input-field': 'onInputChange'
};
}
onButtonClick(event) {
console.log('Кнопка нажата:', event.target.textContent);
}
onInputChange(event) {
console.log('Изменение поля:', event.target.value);
}
renderCallback() {
return (
<div>
<button>Нажми меня</button>
<input class="input-field" type="text" />
</div>
);
}
}
define(MyComponent);
Ключевые моменты:
'click button' — делегирование события
click на все кнопки внутри компонента.'input .input-field' — делегирование события
input на все элементы с классом
input-field.onButtonClick и onInputChange
автоматически получают объект события, в котором можно проверить
event.target и другие свойства.Снижение количества обработчиков. Нет необходимости вешать обработчик на каждый элемент списка, особенно если элементов динамически создаётся много.
Упрощение динамического контента. Элементы, добавленные в DOM после инициализации компонента, автоматически подпадают под делегирование, если их селекторы совпадают.
Централизованная логика. Все обработчики событий находятся в компоненте, что облегчает поддержку кода и отслеживание поведения.
SkateJS поддерживает Shadow DOM. При использовании делегирования необходимо учитывать следующие нюансы:
this), делегирование будет работать
корректно даже с элементами внутри Shadow..shadow-button внутри Shadow
будет доступна только через правильный селектор в методе
events.Пример делегирования в Shadow DOM:
class ShadowComponent extends Component {
static get is() { return 'shadow-component'; }
static get shadow() { return true; }
static get events() {
return {
'click .shadow-button': 'handleClick'
};
}
handleClick(event) {
console.log('Shadow button clicked:', event.target.textContent);
}
renderCallback() {
return (
<div>
<button class="shadow-button">Кнопка в Shadow</button>
</div>
);
}
}
define(ShadowComponent);
SkateJS позволяет комбинировать селекторы, что делает возможным вложенное делегирование:
static get events() {
return {
'click ul li button': 'onNestedButtonClick'
};
}
В этом случае обработчик сработает только для кнопок, находящихся
внутри элементов <li>, которые, в свою очередь,
находятся внутри <ul>. При этом другие кнопки
компонента игнорируются.
renderCallback и
updatedCallback для дополнительной проверки состояния
DOM.event.target и, при необходимости,
event.currentTarget для точного понимания, какой элемент
инициировал событие и какой элемент является родителем обработчика.Делегирование событий в SkateJS делает компоненты более лёгкими,
гибкими и удобными для масштабирования сложных интерфейсов. Правильное
использование events позволяет минимизировать лишние
обработчики и гарантирует корректную работу даже при динамическом
изменении DOM.