Фреймворк Marko предоставляет гибкие возможности для расширения и модификации шаблонов через кастомные теги и директивы. Эти инструменты позволяют создавать динамичные и повторно используемые компоненты, которые значительно облегчают разработку сложных интерфейсов. В этой части рассматриваются принципы работы с кастомными тегами и директивами, их создание и использование.
Кастомные теги в Marko позволяют инкапсулировать логику и разметку в компонентах, которые могут быть повторно использованы по всему приложению. Эти теги могут включать как статический HTML, так и динамическую логику, использующую данные, переданные в компонент.
Простой кастомный тег Для создания кастомного тега
создается новый компонент с соответствующим расширением
.marko. Внутри компонента можно использовать синтаксис
Marko, включая HTML-разметку и JavaScript для динамического
взаимодействия.
Пример простого кастомного тега:
<template>
<div class="card">
<h2>${input.title}</h2>
<p>${input.content}</p>
</div>
</template>
<script>
module.exports = {
onInput(input) {
// Логика обработки входных данных
}
};
</script>
В этом примере компонент “card” отображает заголовок и содержание,
полученные через input. Такие компоненты можно использовать
в других частях приложения, например:
<card title="Привет, мир!" content="Это простой пример кастомного тега."></card>
Особенности кастомных тегов
input — объект,
который содержит данные, передаваемые в компонент.<script>, где можно использовать обработчики событий,
методы и другие механизмы работы с данными.Директивы в Marko — это мощный инструмент для добавления функциональности прямо в разметку шаблона. Они могут изменять поведение или внешний вид элементов, а также управлять их состоянием в зависимости от условий.
Использование директив Директивы применяются к
элементам разметки и начинаются с префикса x-. Это
позволяет легко расширять функциональность, не изменяя структуру
шаблона. Например, директива x-if используется для
условного рендеринга:
<div>
<x-if test=${user.isLoggedIn}>
<p>Добро пожаловать, ${user.name}!</p>
</x-if>
<x-else>
<p>Пожалуйста, войдите в систему.</p>
</x-else>
</div>
Здесь блок с приветствием отображается только в том случае, если
условие user.isLoggedIn истинно. В противном случае
срабатывает блок с предложением войти в систему.
Популярные директивы
x-if: Отображает элемент, если условие истинно.x-for: Создает цикл по массиву или коллекции
объектов.x-bind: Привязывает атрибуты элемента к значениям из
данных.x-on: Добавляет обработчики событий.Пример использования директивы x-for для перебора
массива:
<ul>
<x-for|item of=${items}>
<li>${item.name}</li>
</x-for>
</ul>
Этот код создает список, в котором каждый элемент будет представлен
значением из массива items.
Директивы и привязка данных Одна из ключевых особенностей Marko — это двусторонняя привязка данных. Использование директив позволяет динамически изменять элементы на основе изменения данных в приложении.
Пример использования x-bind:
<button x-bind:disabled=${isDisabled}>Отправить</button>
Здесь кнопка будет недоступна для нажатия, если переменная
isDisabled истинна.
Marko позволяет создавать собственные директивы, которые могут быть использованы для выполнения сложной логики или взаимодействия с компонентами.
Пример создания кастомной директивы Чтобы создать кастомную директиву, необходимо зарегистрировать ее в файле конфигурации проекта. Например, создадим директиву, которая будет изменять стиль элемента на основе условия.
module.exports = {
directives: {
'x-toggle-style': (el, value) => {
if (value) {
el.style.backgroundColor = 'green';
} else {
el.style.backgroundColor = 'red';
}
}
}
};
Эту директиву можно использовать следующим образом:
<div x-toggle-style=${isActive}>Статус</div>
В этом примере, если isActive равно true,
элемент получит зеленый фон, иначе — красный.
Кастомные теги и директивы — это мощные инструменты в Marko, позволяющие создавать гибкие и переиспользуемые компоненты. Их использование помогает разрабатывать более чистую и поддерживаемую архитектуру, а также позволяет интегрировать сложную логику и функциональность непосредственно в разметку.