Mithril — это современный JavaScript-фреймворк для построения одностраничных приложений (SPA), отличающийся минималистичностью и высокой производительностью. Компонентная архитектура является ключевым принципом работы с Mithril и позволяет создавать приложения, структурированные в виде иерархии независимых, повторно используемых компонентов.
Компонент в Mithril представляет собой объект с как минимум одним
методом view. Этот метод возвращает описание интерфейса в
формате виртуального DOM. Простейший компонент выглядит следующим
образом:
const Hello = {
view: () => m("div", "Привет, Mithril!")
};
view — единственный обязательный метод компонента.m() — функция создания виртуальных узлов (vnode),
принимающая тег, атрибуты и дочерние элементы.Компоненты могут быть функциональными или объектными:
// Функциональный компонент
const Functional = () => m("span", "Функциональный компонент");
// Объектный компонент с состоянием
const Stateful = {
count: 0,
view: () => m("button", { onclick: () => Stateful.count++ }, Stateful.count)
};
Функциональные компоненты подходят для статических или простых динамических интерфейсов. Объектные компоненты удобны, когда требуется хранение внутреннего состояния.
Mithril предоставляет механизмы управления состоянием и жизненным циклом компонентов через специальные методы:
Пример использования жизненного цикла:
const Timer = {
seconds: 0,
oninit: () => Timer.interval = setInterval(() => {
Timer.seconds++;
m.redraw();
}, 1000),
onremove: () => clearInterval(Timer.interval),
view: () => m("div", `Прошло секунд: ${Timer.seconds}`)
};
m.redraw() — инициирует повторный рендер
компонента.Компоненты Mithril могут принимать параметры через объект
attrs, передаваемый при создании vnodes:
const Greeting = {
view: ({ attrs }) => m("h1", `Привет, ${attrs.name}!`)
};
m.mount(document.body, {
view: () => m(Greeting, { name: "Мир" })
});
attrs содержит все переданные свойства.Компоненты могут быть вложенными, что позволяет строить сложные интерфейсы из небольших, переиспользуемых частей:
const Header = { view: () => m("header", "Заголовок") };
const Content = { view: () => m("main", "Основное содержимое") };
const Footer = { view: () => m("footer", "Подвал") };
const Page = {
view: () => m("div", [ m(Header), m(Content), m(Footer) ])
};
m.mount(document.body, Page);
Mithril использует простой, но мощный механизм реактивного обновления интерфейса:
m.redraw().Пример реактивного компонента с инкрементом:
const Counter = {
count: 0,
view: () => m("div", [
m("span", `Счетчик: ${Counter.count}`),
m("button", { onclick: () => { Counter.count++; m.redraw(); } }, "Увеличить")
])
};
m.redraw() гарантирует синхронное обновление
интерфейса.Mithril не навязывает способ стилизации, но рекомендуются следующие подходы:
m("div", { style: { color: "blue", fontWeight: "bold" } }, "Текст")
class или
className:m("div", { class: "my-class another-class" }, "Текст")
Компоненты могут загружать данные асинхронно с помощью
oninit и промисов. Mithril автоматически вызывает
m.redraw() при завершении промиса через
m.request.
const Users = {
users: [],
oninit: () => {
m.request({ method: "GET", url: "/api/users" })
.then(data => Users.users = data);
},
view: () => m("ul", Users.users.map(u => m("li", u.name)))
};
attrs и события, избегая глобальных переменных.m.redraw() и тяжелых вычислений в view.Компонентная архитектура Mithril позволяет создавать структурированные, поддерживаемые и производительные приложения. Использование жизненного цикла, атрибутов, вложенных компонентов и реактивного обновления формирует прочную основу для разработки интерфейсов любой сложности.