Функциональные компоненты в Mithril представляют собой чистые
функции, возвращающие виртуальный DOM. Они не имеют собственного
состояния и методов жизненного цикла, что делает их лёгкими и
предсказуемыми. Основная идея заключается в том, что компонент — это
функция () => m(), где m() — это создание
виртуального DOM-узла.
const Hello = () => m("h1", "Привет, Mithril!");
Вызов m(Hello) в m.mount или внутри другого
компонента отрендерит элемент
<h1>Привет, Mithril!</h1>.
Функциональный компонент может принимать объект attrs,
содержащий свойства компонента. Эти атрибуты позволяют передавать данные
внутрь компонента, аналогично пропсам в React.
const Greeting = ({ name }) => m("h2", `Привет, ${name}!`);
m.mount(document.body, {
view: () => m(Greeting, { name: "Мир" })
});
Ключевые моменты:
m().Функциональные компоненты легко комбинировать, создавая иерархию интерфейса.
const Button = ({ label, onclick }) => m("button", { onclick }, label);
const Toolbar = () => m("div.toolbar", [
m(Button, { label: "Сохранить", onclick: () => console.log("Сохранено") }),
m(Button, { label: "Отмена", onclick: () => console.log("Отменено") })
]);
m.mount(document.body, Toolbar);
m(Component, attrs).Функциональные компоненты полностью поддерживают события. Атрибуты
onclick, oninput, onchange и
другие можно передавать как обычные функции.
const Counter = ({ count, onIncrement }) =>
m("div", [
m("span", `Счётчик: ${count}`),
m("button", { onclick: onIncrement }, "Увеличить")
]);
let counter = 0;
m.mount(document.body, {
view: () => m(Counter, {
count: counter,
onIncrement: () => { counter++; m.redraw(); }
})
});
Особенности Mithril:
m.redraw().Функциональные компоненты не имеют собственного состояния в классическом виде, но можно использовать замыкания или внешние объекты для хранения состояния.
const Timer = () => {
let seconds = 0;
setInterval(() => { seconds++; m.redraw(); }, 1000);
return () => m("div", `Прошло секунд: ${seconds}`);
};
m.mount(document.body, Timer);
view, которая
вызывается для рендера.Если проект настроен на использование JSX, функциональные компоненты Mithril можно писать в виде привычного JSX:
/** @jsx m */
const Message = ({ text }) => <p>{text}</p>;
m.mount(document.body, {
view: () => <Message text="Привет с JSX" />
});
m() остаётся внутренней функцией JSX-транспиляции.Функциональные компоненты в Mithril очень лёгкие и быстрые. Для оптимизации можно использовать:
key): помогает
Mithril корректно обновлять список элементов.const List = ({ items }) =>
m("ul", items.map(item => m("li", { key: item.id }, item.name)));
view.Функциональные компоненты полностью совместимы с объектными компонентами Mithril, что позволяет постепенно заменять классы на функции:
const ObjectComponent = {
view: ({ attrs }) => m("div", `Привет, ${attrs.name}`)
};
const App = () => m("div", [
m(ObjectComponent, { name: "Мир" }),
m(Greeting, { name: "Mithril" })
]);
m.mount(document.body, App);
Функциональные компоненты Mithril представляют собой простой и эффективный способ создания интерфейсов. Они минималистичны, легко тестируются и позволяют строить сложные приложения, комбинируя чистые функции, замыкания и внешнее состояние. Их использование ускоряет разработку, упрощает поддержку и делает код более предсказуемым.