Mithril — минималистичный фреймворк для создания одностраничных приложений, где компоненты играют ключевую роль в организации интерфейса. Передача данных между компонентами реализуется через свойства (attrs), контекст или внешние хранилища состояния. Рассмотрим эти подходы подробно.
Каждый компонент в Mithril может принимать атрибуты, передаваемые при
его вызове. Атрибуты доступны через объект vnode.attrs.
Этот подход аналогичен props в React и является основным способом
передачи данных от родительского компонента к дочернему.
const Child = {
view: (vnode) => {
return m("div", `Привет, ${vnode.attrs.name}!`);
}
};
const Parent = {
view: () => {
return m(Child, { name: "Мир" });
}
};
Особенности:
Для взаимодействия дочернего компонента с родителем часто используют функции в атрибутах. Дочерний компонент вызывает функцию, переданную родителем, для уведомления об изменениях или событиях.
const Child = {
view: (vnode) => {
return m("button", { onclick: () => vnode.attrs.onClick("данные") }, "Отправить данные");
}
};
const Parent = {
onChildClick: (data) => {
console.log("Получены данные:", data);
},
view: () => {
return m(Child, { onClick: Parent.onChildClick });
}
};
Ключевые моменты:
Если данные нужно использовать в нескольких компонентах, удобнее хранить их в отдельном объекте состояния. Mithril не навязывает конкретный способ глобального состояния, но часто используют обычные объекты или специализированные менеджеры состояния.
const store = {
count: 0,
increment() {
this.count++;
}
};
const Counter = {
view: () => {
return m("div", [
m("p", `Счётчик: ${store.count}`),
m("button", { onclick: () => store.increment() }, "Увеличить")
]);
}
};
Особенности:
m.redraw() для явного обновления
интерфейса.В сложных приложениях компоненты часто строятся из других
компонентов, передавая данные через attrs по цепочке. Важно
структурировать данные так, чтобы каждый компонент получал только
необходимое.
const Item = {
view: (vnode) => m("li", vnode.attrs.text)
};
const List = {
view: (vnode) => m("ul", vnode.attrs.items.map(item => m(Item, { text: item })))
};
const App = {
view: () => m(List, { items: ["Пункт 1", "Пункт 2", "Пункт 3"] })
};
Рекомендации:
Mithril поддерживает контекстные данные, которые
передаются через vnode.state. Это позволяет хранить
локальное состояние компонента, недоступное напрямую родителю.
const Toggle = {
oninit: (vnode) => {
vnode.state.active = false;
},
view: (vnode) => {
return m("button", {
onclick: () => vnode.state.active = !vnode.state.active
}, vnode.state.active ? "Вкл" : "Выкл");
}
};
Особенности:
vnode.state живут только в рамках
компонента.vnode.state).Передача данных в Mithril организована вокруг простого, но гибкого механизма attrs и состояния компонентов. Такой подход позволяет создавать масштабируемые приложения с чистой структурой и управляемым потоком данных.