Mithril — это лёгкий и высокопроизводительный фреймворк для создания клиентских интерфейсов на JavaScript. Одним из ключевых аспектов работы с компонентами является понимание жизненного цикла, который определяет последовательность вызова методов при создании, обновлении и удалении компонентов.
Компоненты в Mithril могут быть представлены как объекты с методами или как функции. Для объектов доступны следующие методы жизненного цикла:
oninit(vnode) Вызывается один раз
при инициализации компонента перед его первым рендером. Используется для
установки начального состояния, инициализации переменных и подписок на
события.
const Counter = {
count: 0,
oninit(vnode) {
this.count = vnode.attrs.start || 0;
},
view() {
return m("button", { onclick: () => this.count++ }, `Count: ${this.count}`);
}
}oncreate(vnode) Вызывается после
того, как DOM-элемент компонента был добавлен в документ. Позволяет
работать с реальными элементами, выполнять анимации, устанавливать
сторонние библиотеки.
oncreate(vnode) {
vnode.dom.style.transition = "all 0.3s";
}onbeforeupdate(vnode, old)
Вызывается перед обновлением компонента. Позволяет предотвратить
ререндер, возвращая false. Может использоваться для
оптимизации производительности.
onbeforeupdate(vnode, old) {
return vnode.attrs.value !== old.attrs.value;
}onupdate(vnode) Вызывается после
обновления компонента в DOM. Часто используется для синхронизации
состояния DOM с изменениями данных.
onupdate(vnode) {
console.log("Component updated");
}onbeforeremove(vnode) Вызывается
перед удалением DOM-элемента. Можно возвращать промис, чтобы задержать
удаление до завершения анимации.
onbeforeremove(vnode) {
return new Promise(resolve => {
vnode.dom.classList.add("fade-out");
setTimeout(resolve, 300);
});
}onremove(vnode) Вызывается после
удаления элемента из DOM. Используется для очистки таймеров, отписки от
событий и освобождения ресурсов.
onremove(vnode) {
console.log("Component removed");
}Все методы жизненного цикла получают объект vnode —
виртуальный узел, представляющий компонент. Он содержит ключевые
свойства:
vnode.attrs — объект с атрибутами,
переданными компоненту.vnode.state — состояние компонента,
которое можно использовать для хранения данных.vnode.dom — реальный DOM-элемент после
рендера.vnode.children — дочерние виртуальные
узлы, если они присутствуют.Использование vnode позволяет компоненту быть
самодостаточным и управлять своим состоянием без глобальных
переменных.
Функциональные компоненты в Mithril — это простые функции,
возвращающие виртуальный DOM. Они не имеют встроенных методов жизненного
цикла, но через обёртки или хуки можно имитировать oncreate
и onupdate:
const FunctionalCounter = (vnode) => {
let count = vnode.attrs.start || 0;
return {
view() {
return m("button", { onclick: () => count++ }, `Count: ${count}`);
},
oncreate() {
console.log("Created functional component");
}
}
}
Mithril использует виртуальный DOM и диффинг, поэтому оптимизация жизненного цикла помогает уменьшить количество операций с реальным DOM:
onbeforeupdate позволяет пропускать ненужные
ререндеры.key в списках компонентов помогает
корректно обновлять только изменённые элементы.const ItemList = {
view(vnode) {
return m("ul", vnode.attrs.items.map(item =>
m("li", { key: item.id }, item.name)
));
}
}
Жизненный цикл идеально подходит для интеграции с анимациями и библиотеками вроде GSAP или D3:
oncreate — инициализация анимации при
монтировании.onupdate — синхронизация изменений данных с
анимацией.onbeforeremove — плавное удаление элемента.onbeforeremove(vnode) {
return new Promise(resolve => {
gsap.to(vnode.dom, { opacity: 0, duration: 0.5, onComplete: resolve });
});
}
vnode.state вместо глобальных переменных.view, переносить их в oninit или
отдельные методы.key для списков для
оптимизации рендеринга.onremove для предотвращения утечек памяти.Эти принципы позволяют создавать масштабируемые и производительные приложения на Mithril, эффективно управляя состоянием и DOM.