В библиотеке Haunted директивы являются мощным инструментом для
расширения возможностей шаблонов, построенных с помощью
lit-html. Они позволяют управлять рендерингом, состоянием и
динамическим поведением элементов без необходимости вручную обновлять
DOM. Директивы — это функции, возвращаемые из lit-html и
вызываемые внутри шаблонов, которые получают контейнер, значение и
текущую директиву, обеспечивая гибкий контроль над рендерингом.
Директива — это функция, которая возвращает объект с
методом update и/или render. Эти методы
вызываются при каждом обновлении шаблона. Стандартный вызов выглядит
следующим образом:
import { directive, html } from 'lit-html';
const myDirective = directive((value) => (part) => {
part.setValue(`Значение: ${value}`);
});
В этом примере директива принимает value и устанавливает
его в часть DOM, связанного с шаблоном.
Ключевые моменты:
parts в шаблоне.lit-html предоставляет ряд встроенных директив, которые
активно применяются в Haunted для реактивного рендеринга.
ifDefinedДиректива ifDefined позволяет рендерить значение
атрибута только если оно определено. Полезна для условного добавления
атрибутов:
import { html } from 'lit-html';
import { ifDefined } from 'lit-html/directives/if-defined.js';
const template = (value) => html`
<input type="text" value="${ifDefined(value)}">
`;
Если value равен undefined, атрибут
value не добавляется.
repeatДиректива repeat оптимизирует рендеринг массивов и
списков, предотвращая повторное создание элементов при обновлениях:
import { html } from 'lit-html';
import { repeat } from 'lit-html/directives/repeat.js';
const items = ['apple', 'banana', 'cherry'];
const template = html`
<ul>
${repeat(items, (item) => item, (item, index) => html`<li>${item}</li>`)}
</ul>
`;
Пояснение параметров:
repeat предотвращает перерисовку элементов, которые не
изменились, сохраняя состояние внутри элементов.
guardДиректива guard позволяет ограничивать обновление
шаблона только при изменении определенных данных:
import { html } from 'lit-html';
import { guard } from 'lit-html/directives/guard.js';
const template = (data) => html`
${guard([data], () => html`<p>${data.text}</p>`)}
`;
guard предотвращает ненужные вызовы рендеринга, если
зависимости не изменились.
Для создания пользовательской директивы используется функция
directive, возвращающая функцию
DirectiveResult. Основная структура:
import { directive, PartType } from 'lit-html';
const myDirective = directive((value) => (part) => {
if (part.type === PartType.PROPERTY) {
part.setValue(value.toUpperCase());
}
});
Этапы работы пользовательской директивы:
setValue
применяется к части DOM.Haunted строит компоненты на основе lit-html и
customElements. Директивы позволяют:
Пример интеграции:
import { html } from 'lit-html';
import { component, useState } from 'haunted';
import { repeat } from 'lit-html/directives/repeat.js';
function TodoList({ todos }) {
return html`
<ul>
${repeat(todos, todo => todo.id, todo => html`<li>${todo.text}</li>`)}
</ul>
`;
}
customElements.define('todo-list', component(TodoList));
Использование repeat внутри Haunted-компонента
обеспечивает минимальные перерисовки списка при изменении элементов.
update:
директива должна обновлять только DOM, вычисления лучше делать вне
шаблона.Директивы в Haunted с lit-html предоставляют:
Использование директив — ключевой элемент для построения производительных и легко поддерживаемых веб-компонентов.