Mithril — лёгкий и современный JavaScript-фреймворк для построения одностраничных приложений. Основная сила Mithril заключается в его виртуальном DOM и простом, но гибком синтаксисе создания компонентов. Важнейшей частью этого процесса является использование Hyperscript или JSX для описания структуры интерфейса.
Hyperscript в Mithril — это функция m(), которая создаёт
виртуальные DOM-узлы. Общий синтаксис выглядит так:
m(tag, attrs, children)
tag — строка с именем HTML-тега или компонент;attrs — объект атрибутов и свойств элемента;children — дочерние элементы, текст или массив
элементов.Примеры использования:
m('div', { class: 'container' }, 'Привет, Mithril!')
Создаёт
<div class="container">Привет, Mithril!</div>.
m('ul',
m('li', 'Элемент 1'),
m('li', 'Элемент 2'),
m('li', 'Элемент 3')
)
Дочерние элементы можно передавать как массив:
m('ul', [
m('li', 'Элемент A'),
m('li', 'Элемент B'),
m('li', 'Элемент C')
])
Особенности Hyperscript в Mithril:
onclick,
oninput) и классы через class или
className.const Item = {
view: (vnode) => m('li', vnode.attrs.text)
};
m('ul', [
m(Item, { text: 'Первый' }),
m(Item, { text: 'Второй' })
])
m('ul', [
m('li', { key: 1 }, 'Элемент 1'),
m('li', { key: 2 }, 'Элемент 2')
])
JSX в Mithril — это синтаксис, напоминающий HTML, который
компилируется в вызовы функции m(). Чтобы использовать JSX,
необходимо подключить Babel с плагином для трансформации JSX в вызовы
m(). Конфигурация обычно выглядит так:
{
"plugins": [
["@babel/plugin-transform-react-jsx", { "pragma":"m" }]
]
}
Пример компонента на JSX:
const List = {
view: () => (
<ul class="list">
<li>Элемент 1</li>
<li>Элемент 2</li>
<li>Элемент 3</li>
</ul>
)
};
JSX автоматически преобразует вложенные элементы в массивы виртуальных DOM-узлов, аналогично Hyperscript. Атрибуты и события передаются через обычные свойства:
<button oncl ick={() => alert('Клик!')}>Нажми меня</button>
Преимущества использования JSX:
{}.| Особенность | Hyperscript | JSX |
|---|---|---|
| Синтаксис | m(‘tag’, attrs, children) | |
| Читаемость | Менее визуальна | Похожа на HTML, легче воспринимается |
| Динамические элементы | Передаются через массивы | Используется фигурная скобка {} |
| Поддержка событий | Через onclick, oninput |
Через аналогичные атрибуты JSX |
| Ключи для списков | key в attrs |
key в атрибуте компонента |
В Hyperscript и JSX можно создавать динамические элементы:
Hyperscript:
m('ul', items.map(item => m('li', { key: item.id }, item.name)))
JSX:
<ul>
{items.map(item => <li key={item.id}>{item.name}</li>)}
</ul>
Для условного отображения удобно использовать тернарный оператор:
m('div', condition ? 'Да' : 'Нет')
<div>{condition ? 'Да' : 'Нет'}</div>
Mithril позволяет строить компоненты как функции или объекты с
методом view:
const Button = {
view: (vnode) => m('button', { onclick: vnode.attrs.onClick }, vnode.attrs.label)
};
const App = {
view: () => m('div', [
m(Button, { label: 'Кнопка 1', onClick: () => alert(1) }),
m(Button, { label: 'Кнопка 2', onClick: () => alert(2) })
])
};
На JSX это выглядит ещё чище:
const App = () => (
<div>
<Button label="Кнопка 1" onCl ick={() => alert(1)} />
<Button label="Кнопка 2" onCl ick={() => alert(2)} />
</div>
);
В Hyperscript атрибут class передаётся как строка или
как объект для условных классов:
m('div', { class: isActive ? 'active' : '' })
В JSX синтаксис схож:
<div class={isActive ? 'active' : ''}></div>
Hyperscript и JSX в Mithril предоставляют гибкие и мощные инструменты для построения интерфейсов. Hyperscript хорош для компактного, программного создания DOM-узлов, JSX — для удобной визуализации структуры компонентов и более читаемого кода в сложных проектах. Их использование напрямую влияет на стиль разработки и удобство поддержки кода в масштабных приложениях.