Mithril — это легковесный фреймворк для создания одностраничных приложений на JavaScript, ориентированный на высокую производительность и минимальный размер. Важной частью любого UI-фреймворка является система событий, которая обеспечивает интерактивность компонентов. В Mithril обработка событий реализована простым и эффективным образом, соответствующим принципам виртуального DOM и реактивного рендеринга.
В Mithril события добавляются непосредственно к элементам
виртуального DOM через объект атрибутов при вызове m():
m('button', { onclick: () => console.log('Нажата кнопка') }, 'Кликни меня')
Ключевые моменты:
onclick, oninput, onchange,
onmouseover и другие события HTML напрямую
поддерживаются.this) по умолчанию не привязан
к компоненту. Если необходим доступ к внутренним данным компонента,
лучше использовать стрелочные функции или bind.Обработчики событий можно использовать внутри компонентов Mithril:
const Counter = {
count: 0,
view() {
return m('div', [
m('p', `Счёт: ${this.count}`),
m('button', { onclick: () => { this.count++ } }, 'Увеличить')
])
}
}
Особенности:
Передача параметров в обработчик осуществляется через замыкания:
const listItemClick = (id) => () => console.log(`Элемент ${id} выбран`)
m('ul', [
[1, 2, 3].map(id => m('li', { onclick: listItemClick(id) }, `Элемент ${id}`))
])
Mithril передаёт объект события как первый аргумент в обработчик:
m('input', {
oninput: (e) => console.log(e.target.value)
})
preventDefault()
и stopPropagation():m('form', {
onsubmit: (e) => {
e.preventDefault()
console.log('Форма отправлена')
}
})
Mithril не предоставляет встроенной системы делегирования событий,
как в jQuery. Вместо этого рекомендуется использовать обработку событий
на уровне контейнера и проверку event.target:
m('ul', {
onclick: (e) => {
if(e.target.tagName === 'LI') {
console.log(`Выбран ${e.target.textContent}`)
}
}
}, [
m('li', 'Элемент 1'),
m('li', 'Элемент 2'),
m('li', 'Элемент 3')
])
Обработчики могут быть асинхронными функциями, что удобно для работы с API:
m('button', {
onclick: async () => {
const data = await fetch('/api/data').then(res => res.json())
console.log(data)
}
}, 'Загрузить данные')
Mithril позволяет использовать пользовательские события через
стандартный механизм dispatchEvent:
const el = m('div', { id: 'custom' })
el.dom.addEventListener('custom', (e) => console.log(e.detail))
el.dom.dispatchEvent(new CustomEvent('custom', { detail: 'данные' }))
async/await
внутри обработчиков.Система событий в Mithril строится на простоте и прозрачности: каждый обработчик напрямую связан с элементом виртуального DOM, а все обновления состояния автоматически интегрируются в цикл перерисовки. Такой подход позволяет создавать быстрые, предсказуемые и масштабируемые пользовательские интерфейсы.