Контейнеризация в контексте Mithril подразумевает организацию приложения через структуру компонентов, каждый из которых инкапсулирует состояние, логику и представление. Mithril предоставляет минималистичный подход к разработке, позволяя строить как простые виджеты, так и крупные SPA с хорошо организованной архитектурой.
Компонент в Mithril — это объект с как минимум одним
методом view. Стандартная форма компонента:
const MyComponent = {
view: () => m("div", "Пример компонента")
};
Компоненты могут быть функциональными, возвращающими
объект с view:
function MyFunctionalComponent() {
return {
view: () => m("div", "Функциональный компонент")
};
}
Ключевые моменты:
m(Component, attrs, children).Контейнер — это компонент, отвечающий за управление состоянием приложения и передачу данных дочерним компонентам. Такой подход разделяет логику и представление, что упрощает поддержку больших приложений.
Пример контейнера с внутренним состоянием:
const CounterContainer = {
count: 0,
view: () => m("div",
[
m("button", { onclick: () => CounterContainer.count-- }, "-"),
m("span", ` ${CounterContainer.count} `),
m("button", { onclick: () => CounterContainer.count++ }, "+")
]
)
};
Здесь контейнер выполняет несколько функций:
count).Mithril позволяет передавать данные в компоненты через атрибуты (attrs). Это облегчает построение многоуровневой иерархии компонентов.
const Display = {
view: ({ attrs }) => m("p", `Текущее значение: ${attrs.value}`)
};
const CounterContainer = {
count: 0,
view: () => m("div",
[
m(Display, { value: CounterContainer.count }),
m("button", { onclick: () => CounterContainer.count++ }, "Добавить")
]
)
};
Особенности передачи данных:
attrs — объект, содержащий все переданные
свойства.Контейнеры часто берут на себя роль загрузки данных через Mithril request API:
const UserContainer = {
users: [],
load: () => m.request({ method: "GET", url: "/api/users" })
.then(data => UserContainer.users = data),
oninit: () => UserContainer.load(),
view: () => m("ul",
UserContainer.users.map(user => m("li", user.name))
)
};
Ключевые моменты:
oninit вызывается один раз при инициализации
компонента.attrs.Для масштабирования приложения рекомендуется выделять:
view, без логики состояния.Пример структуры:
/src
/components
Button.js
UserList.js
/containers
UserContainer.js
/services
api.js
app.js
Это позволяет:
Mithril поддерживает динамическое подключение компонентов в зависимости от состояния:
const PageContainer = {
page: "home",
view: () => m("div",
PageContainer.page === "home" ? m(HomeComponent) : m(AboutComponent)
)
};
Такой подход обеспечивает условное отображение без необходимости сложного роутинга, что упрощает создание SPA.
Контейнеризация в Mithril строится на разделении логики и
отображения, использовании attrs для передачи
данных, и хранении состояния в контейнерах. Такой подход позволяет
строить масштабируемые приложения, где каждый компонент выполняет четко
определенную роль: контейнер управляет состоянием и логикой, дочерние
компоненты занимаются только визуализацией и обработкой событий.
Структурированное использование контейнеров облегчает сопровождение кода, тестирование и повторное использование компонентов, сохраняя минималистичную природу Mithril без лишней абстракции.