Фреймворк Marko использует декларативный синтаксис для описания
пользовательских интерфейсов. Шаблоны в Marko представляют собой файлы с
расширением .marko, в которых описывается структура и
поведение интерфейса с использованием HTML-подобного синтаксиса. В этом
разделе рассмотрим основные элементы синтаксиса, с которыми предстоит
работать при создании шаблонов.
Каждый шаблон в Marko состоит из двух основных частей: HTML-разметки и кода, выполняющего динамическую логику. Стандартный шаблон выглядит как обычный HTML-документ с возможностью внедрения JavaScript-кода внутри.
<template>
<div class="example">
<h1>${data.title}</h1>
<p>${data.description}</p>
</div>
</template>
В этом примере <template> — это основная обертка
для всего содержимого шаблона. Разметка внутри шаблона может быть как
статической (HTML), так и динамической, где данные подставляются с
помощью ${}.
В Marko для работы с данными используются переменные, передаваемые в
шаблон через объект data. Эти данные можно передавать из
JavaScript-кода, который использует шаблон. Каждый объект внутри
${} представляет собой доступ к свойствам объекта
data.
Пример передачи данных:
const template = require('./template.marko');
template.renderSync({
title: "Заголовок страницы",
description: "Описание страницы"
});
В шаблоне это отразится как:
<h1>Заголовок страницы</h1>
<p>Описание страницы</p>
Marko поддерживает условные конструкции, которые позволяют включать
или исключать части шаблона в зависимости от условий. Для этого
используется директива if, которая работает аналогично
условному оператору в JavaScript.
Пример использования:
<template>
<div>
<if(test)><p>Условие выполнено!</p></if>
<else><p>Условие не выполнено.</p></else>
</div>
</template>
В данном примере, если переменная test имеет значение
true, будет выведен текст “Условие выполнено!”. В противном
случае отобразится “Условие не выполнено”.
Для перебора коллекций данных в Marko используется директива
for, аналогичная циклу for в JavaScript. Это
позволяет динамически генерировать повторяющиеся элементы на основе
массивов или объектов.
Пример:
<template>
<ul>
<for|item of data.items>
<li>${item}</li>
</for>
</ul>
</template>
Здесь data.items — это массив, элементы которого будут
поочередно отрисовываться в виде списка <li>. Каждое
значение элемента массива будет подставляться в
${item}.
Marko позволяет создавать компоненты, которые могут быть вложены друг в друга, что способствует лучшей структуре и повторному использованию кода. Компоненты используют аналогичный синтаксис, как и обычные шаблоны, но с возможностью инкапсуляции логики и передачи данных.
Пример создания компонента:
<!-- components/greeting.marko -->
<template>
<div>
<h1>Привет, ${data.name}!</h1>
</div>
</template>
Вызов компонента в другом шаблоне:
<template>
<div>
<greeting name="Мария"></greeting>
</div>
</template>
В данном примере компонент greeting будет отрисован с
данными, переданными через атрибут name. Это позволяет
легко переиспользовать компоненты в разных частях приложения.
Данные можно передавать между компонентами как через атрибуты, так и
через внутренние переменные. Для этого используется директива
data, которая позволяет передавать объект данных в дочерний
компонент.
Пример:
<template>
<div>
<greeting data=parentData></greeting>
</div>
</template>
В дочернем компоненте:
<template>
<div>
<h1>Привет, ${data.name}!</h1>
</div>
</template>
Здесь объект parentData будет передан в компонент
greeting, который будет использовать свойство
name из этого объекта для отображения.
Marko поддерживает возможность динамически менять атрибуты HTML-элементов. Например, можно изменить класс элемента в зависимости от данных.
Пример:
<template>
<div class="item ${data.isActive ? 'active' : ''}">
${data.text}
</div>
</template>
В этом примере класс active будет добавлен только в том
случае, если значение data.isActive истинно. Это позволяет
гибко изменять внешний вид элементов в зависимости от состояния
данных.
Marko также поддерживает добавление обработчиков событий, которые можно использовать для взаимодействия с пользовательским интерфейсом. Например, чтобы привязать обработчик клика:
<template>
<button on-click="handleClick">Нажми меня</button>
</template>
В коде компонента можно описать сам обработчик:
module.exports = {
handleClick() {
alert('Кнопка нажата!');
}
};
Этот обработчик будет вызываться при клике на кнопку.
Синтаксис шаблонов Marko гибок и мощен, позволяя создавать сложные, динамичные интерфейсы с использованием знакомых инструментов — HTML, JavaScript и декларативного подхода. Понимание базовых конструкций и принципов работы с данными является важным шагом для освоения работы с этим фреймворком.