Polymer предоставляет мощные инструменты для работы с веб-компонентами, включая динамическое создание и управление шаблонами. Шаблоны позволяют отделять структуру DOM от логики приложения, обеспечивая повторное использование кода и реактивность.
<template> и dom-repeatВ основе динамических шаблонов лежит элемент
<template>. В Polymer он используется совместно с
директивами вроде dom-repeat и dom-if,
обеспечивая создание DOM-элементов на основе данных.
Пример:
<dom-module id="user-list">
<template>
<template is="dom-repeat" items="{{users}}">
<div>Имя: [[item.name]], Возраст: [[item.age]]</div>
</template>
</template>
<script>
class UserList extends Polymer.Element {
static get is() { return 'user-list'; }
static get properties() {
return {
users: {
type: Array,
value: () => [
{name: 'Анна', age: 25},
{name: 'Иван', age: 30}
]
}
};
}
}
customElements.define(UserList.is, UserList);
</script>
</dom-module>
Ключевые моменты:
dom-repeat автоматически создает экземпляры шаблона для
каждого элемента массива users.[[item.property]].dom-ifДля динамического создания элементов на основе условий используется
dom-if. Этот шаблон позволяет рендерить DOM только при
соблюдении определённого условия.
Пример:
<template is="dom-if" if="[[showDetails]]">
<div>Подробная информация доступна</div>
</template>
Особенности:
if связывается с булевой переменной.true.restamp позволяет полностью удалять и
пересоздавать шаблон при изменении условия.<template is="dom-if" if="[[showDetails]]" restamp>
<div>Динамически пересоздаваемый блок</div>
</template>
Помимо декларативного способа, Polymer позволяет создавать шаблоны
программно через JavaScript. Метод Polymer.DomModule и API
document.importNode обеспечивают клонирование и вставку
шаблонов в DOM.
Пример:
const template = document.createElement('template');
template.innerHTML = `<div>Программно созданный элемент</div>`;
const clone = document.importNode(template.content, true);
this.shadowRoot.appendChild(clone);
Особенности:
importNode(template.content, true) клонирует содержимое
шаблона с глубоким копированием.<dom-bind>Для динамического рендеринга вне компонентов можно применять
<dom-bind>. Этот подход полезен для небольших страниц
или тестов без создания кастомных элементов.
<template is="dom-bind" id="app">
<template is="dom-repeat" items="[[items]]">
<div>[[item]]</div>
</template>
</template>
<script>
const app = document.querySelector('#app');
app.items = ['Элемент 1', 'Элемент 2', 'Элемент 3'];
</script>
Примечания:
<dom-bind> обеспечивает двустороннюю привязку
данных и реактивное обновление.Для больших массивов или часто изменяющихся данных важно минимизировать лишние перерисовки:
Использование mutableData Позволяет
Polymer отслеживать изменения свойств объектов и массивов без полной
замены.
<template is="dom-repeat" items="{{users}}" mutable-data>Фильтрация и сортировка через вычисляемые свойства Применяются методы для сортировки или фильтрации элементов перед отображением, что снижает нагрузку на DOM.
Ленивая инициализация с dom-if и
restamp Создание элементов только при
необходимости позволяет экономить ресурсы.
Динамические шаблоны часто используются вместе с асинхронными запросами. Polymer предоставляет реактивную работу с промисами и массивами.
Пример загрузки пользователей с сервера:
this.users = [];
fetch('/api/users')
.then(response => response.json())
.then(data => { this.users = data; });
users dom-repeat
автоматически создаёт новые DOM-элементы.dom-if, чтобы показывать
индикатор загрузки.Динамическое создание шаблонов в Polymer обеспечивает гибкую и
масштабируемую работу с DOM, сочетая декларативный подход через
<template> и программное управление через JavaScript.
Правильное использование dom-repeat, dom-if,
<dom-bind> и методов клонирования шаблонов позволяет
создавать сложные, отзывчивые интерфейсы с минимальной нагрузкой на
браузер.