Mithril — это легковесный фронтенд-фреймворк, ориентированный на высокую производительность и простоту разработки. Одной из ключевых особенностей Mithril является система состояний и реактивности, обеспечивающая обновление интерфейса при изменении данных без необходимости сложной инфраструктуры.
В основе работы Mithril лежит однонаправленный поток данных. Состояние приложения обычно хранится в обычных JavaScript-объектах или массивах, что упрощает управление данными и делает их предсказуемыми.
let state = {
count: 0
};
Изменение состояния напрямую не вызывает автоматическое обновление интерфейса. Для этого используется функция m.redraw(), которая инициирует повторный рендеринг компонентов.
function increment() {
state.count += 1;
m.redraw();
}
Важно понимать, что Mithril не использует виртуальные
обсерверы или прокси для отслеживания изменений состояния.
Контроль за обновлением интерфейса полностью ложится на разработчика
через явный вызов m.redraw().
Компоненты в Mithril представляют собой объекты с обязательным
методом view, который возвращает виртуальный DOM.
Простейший компонент выглядит следующим образом:
const Counter = {
view: () => m("button", { onclick: increment }, `Count: ${state.count}`)
};
Каждый раз, когда вызывается m.redraw(), Mithril
сравнивает предыдущий виртуальный DOM с новым и
обновляет только те элементы, которые изменились. Этот процесс
называется diffing, и он минимизирует количество
операций с реальным DOM, повышая производительность.
Mithril обеспечивает два типа редрайн:
m.route или пользовательских событиях,
таких как onclick. Mithril сам вызывает
m.redraw() после выполнения обработчика.m.redraw() в случаях асинхронных операций или внешних
изменений состояния.Пример использования ручного редрайн:
setTimeout(() => {
state.count += 10;
m.redraw();
}, 1000);
Такой подход позволяет точно контролировать, когда интерфейс должен быть обновлен, и избегать лишних перерисовок.
Реактивность в Mithril тесно связана с асинхронными операциями,
такими как запросы к API. Используется стандартный промис или встроенный
метод m.request, который сам инициирует редрайн при
завершении запроса:
m.request({
method: "GET",
url: "/api/items"
})
.then(data => {
state.items = data;
});
После завершения запроса Mithril автоматически вызывает
m.redraw(), обновляя представление с актуальными
данными.
Компоненты могут иметь локальное состояние, которое не зависит от глобального состояния приложения. Локальное состояние обычно создается через closure или свойство объекта компонента:
const Toggle = {
isOn: false,
view: function() {
return m("button", {
onclick: () => {
this.isOn = !this.isOn;
m.redraw();
}
}, this.isOn ? "Включено" : "Выключено");
}
};
Использование локального состояния особенно удобно для компонентов, которые не должны напрямую влиять на глобальное состояние приложения.
Mithril использует дифференцирование виртуального DOM и выборочную перерисовку для поддержания высокой производительности. Для сложных интерфейсов рекомендуется:
Система состояний и реактивность в Mithril базируются на явных изменениях данных и ручном контроле редрайнов, что делает фреймворк предсказуемым и легковесным. Комбинация локального и глобального состояния, а также встроенного механизма diffing виртуального DOM позволяет создавать быстрые и отзывчивые интерфейсы с минимальной нагрузкой на браузер.