Slim.js — это легковесный JavaScript-фреймворк для создания веб-компонентов с реактивными свойствами. Одной из ключевых возможностей является обработка событий, как встроенных DOM, так и пользовательских, с интеграцией реактивных данных.
События в Slim.js привязываются через атрибуты компонента, используя
синтаксис on:event. Например:
class MyComponent extends Slim {
constructor() {
super();
this.message = 'Нажми кнопку';
}
handleClick() {
this.message = 'Кнопка была нажата';
}
get template() {
return `
{{message}}
`;
}
}
customElements.define('my-component', MyComponent);
Ключевой момент: метод, указанный в
on:event, вызывается с контекстом компонента, что позволяет
безопасно изменять свойства через this.
Slim.js поддерживает генерацию собственных событий через метод
dispatch. Пример:
this.dispatch('custom-event', { detail: { value: 42 } });
Эти события можно слушать как внутри компонента, так и извне:
Метод handleCustom получит объект события с доступом к
event.detail.
Тестирование событий в Slim.js можно проводить несколькими способами:
dispatchEvent, а затем проверяется изменение состояния
компонента.const element = document.createElement('my-component');
document.body.appendChild(element);
element.querySelector('button').click();
console.assert(element.message === 'Кнопка была нажата', 'Сообщение обновлено после клика');
let eventReceived = null;
element.addEventListener('custom-event', (e) => {
eventReceived = e.detail.value;
});
element.dispatch('custom-event', { detail: { value: 42 } });
console.assert(eventReceived === 42, 'Пользовательское событие сработало корректно');
const spy = jest.fn();
element.addEventListener('custom-event', spy);
element.dispatch('custom-event', { detail: { value: 99 } });
expect(spy).toHaveBeenCalled();
expect(spy.mock.calls[0][0].detail.value).toBe(99);
this.update() для синхронизации шаблона перед тестом.event.stopPropagation() и
event.preventDefault() работают стандартным образом, их
влияние можно тестировать через имитацию взаимодействий.async/await или промисы.async handleAsync() {
await fetch('/api/data');
this.dataLoaded = true;
}
// В тесте
await element.handleAsync();
console.assert(element.dataLoaded, 'Асинхронное событие завершено');
События тесно связаны с реактивными свойствами Slim.js. Любое изменение свойства через событие автоматически обновляет DOM в компоненте. Это упрощает тестирование: проверка события обычно сводится к проверке состояния свойств.
.click().dispatch с контролем detail.