Концепция компонентов
Фреймворк Marko основывается на принципах компонентной архитектуры, где каждый компонент представляет собой независимый блок, отвечающий за отображение части интерфейса или за выполнение бизнес-логики. Эта модель позволяет создавать сложные веб-приложения, деля их на более мелкие, повторно используемые и тестируемые части.
Компоненты в Marko включают в себя как шаблон (HTML-разметка), так и логику, определяющую поведение и взаимодействие с данными. Каждый компонент имеет файл, который объединяет структуру и функциональность. Это позволяет легко обновлять и расширять интерфейс, не затрагивая остальные части приложения.
Компонент состоит из трех частей:
Шаблон компонента представляет собой разметку, которая используется для описания того, как компонент должен выглядеть. В отличие от обычного HTML, в Marko шаблон интегрируется с логикой компонента. Шаблон поддерживает директивы, позволяющие внедрять динамическое поведение. Например, использование переменных и условных выражений:
<div>
<h1>${data.title}</h1>
<p>${data.description}</p>
</div>
Здесь data.title и data.description — это
данные, передаваемые в компонент, которые выводятся в разметке. Шаблон
может содержать также элементы управления, такие как циклы, условия и
обработчики событий.
Скрипт компонента определяет поведение. Он может включать в себя как обработку состояния, так и взаимодействие с внешними источниками данных. Обычно скрипт компонента начинается с импорта зависимостей, таких как библиотеки и утилиты, а затем следует описание состояния и методов.
module.exports = {
onCreate() {
this.state = { count: 0 };
},
increment() {
this.state.count++;
}
};
В примере выше создается компонент с состоянием count,
которое инициализируется значением 0. Метод increment
увеличивает это значение на 1. Такой подход позволяет компонентам быть
динамичными и изменять свое состояние в ответ на действия пользователя
или изменения данных.
CSS или другие стили, привязанные к компоненту, описывают его внешний вид. Стилевые правила могут быть прописаны непосредственно в компоненте или подключены через отдельные файлы. Marko поддерживает использование CSS-препроцессоров, таких как SASS, и автоматически инкапсулирует стили, чтобы избежать конфликтов между компонентами.
.my-component {
font-size: 16px;
color: #333;
}
Стили, определенные в компоненте, будут применяться только к его внутреннему содержимому, что помогает избежать глобальных конфликтов стилей в приложении.
Данные компонента — это ключевая часть архитектуры Marko. Данные
передаются в компонент через объект data, который может
быть как статичным, так и динамически обновляемым. Компоненты могут
работать с внешними источниками данных, такими как API, и получать
обновления через события или изменения состояния.
Каждый компонент может иметь свойство data, которое
передается при его рендеринге:
<my-component data=pageData />
Здесь pageData — это объект, содержащий все необходимые
данные для компонента. Обработчик данных может быть настроен на
использование состояния компонента или внешних источников данных.
Одним из важнейших аспектов компонентной архитектуры является
взаимодействие компонентов. В Marko компоненты могут быть вложены друг в
друга. Для этого используется концепция дочерних компонентов, которые
могут быть встроены в родительские компоненты с помощью синтаксиса
<component-name />.
<parent-component>
<child-component />
</parent-component>
В данном примере child-component будет рендериться
внутри родительского компонента parent-component.
Компоненты могут обмениваться данными через атрибуты, события или даже
глобальные состояния.
Каждый компонент в Marko имеет жизненный цикл, который включает различные фазы, такие как создание, обновление и удаление. С помощью этих фаз можно управлять состоянием и ресурсами компонента.
Основные этапы жизненного цикла компонента:
Каждый этап жизненного цикла позволяет разработчику вмешиваться в процесс, чтобы настроить поведение компонента в нужный момент.
Marko использует алгоритм рендеринга, который делает акцент на производительности. Компоненты рендерятся только в случае необходимости, и Marko минимизирует количество операций с DOM, что значительно улучшает отклик приложения. Он также использует технологию серверного рендеринга для начальной загрузки страницы, обеспечивая быстрый рендеринг на сервере и отправку готового HTML-кода на клиент.
Также важно отметить, что Marko поддерживает концепцию частичного рендеринга, когда только те части компонента, которые изменились, перерисовываются, а остальные части остаются неизменными. Это значительно сокращает количество операций и повышает производительность при сложных приложениях.
Marko предоставляет широкие возможности для создания интерактивных компонентов. Помимо стандартных методов работы с состоянием, компонент может иметь обработчики событий, которые взаимодействуют с пользователем. Например, события клика могут быть обработаны следующим образом:
<button on-click="increment()">Increment</button>
При клике на кнопку вызовется метод increment(), который
обновит состояние компонента, и разметка будет перерисована с новыми
данными.
Концепция компонентов в Marko делает возможным создание гибких и масштабируемых веб-приложений, где каждый компонент отвечает за свою часть интерфейса и логику. Разделение приложения на компоненты способствует лучшей поддерживаемости и расширяемости, что особенно важно при работе с крупными проектами. Взаимодействие компонентов, управление данными и состоянием, а также поддержка различных этапов жизненного цикла позволяют разработчику легко управлять как статичными, так и динамичными частями интерфейса, что в целом значительно улучшает опыт разработки.