Haunted — это современная библиотека для создания веб-компонентов на
базе Web Components и Hooks,
вдохновлённая React. Она предоставляет инструменты для декларативного
управления состоянием и рендерингом. Важными вспомогательными функциями
являются classMap и
styleMap, позволяющие удобно управлять
CSS-классами и стилями внутри шаблонов.
classMapclassMap используется для динамического применения
классов к элементу. Она принимает объект, где ключи — это имена классов,
а значения — булевы флаги, определяющие, должен ли класс
применяться.
import { html } from 'haunted';
import { classMap } from 'lit-html/directives/class-map.js';
const template = (isActive, isDisabled) => html`
<button class=${classMap({ active: isActive, disabled: isDisabled })}>
Кнопка
</button>
`;
Ключи объекта — имена CSS-классов.
Значения:
true — класс применяется.false — класс не применяется.Можно комбинировать несколько классов динамически без необходимости вручную формировать строку.
Пример 1. Динамическое переключение состояний кнопки:
import { component, useState } from 'haunted';
function ToggleButton() {
const [active, setActive] = useState(false);
return html`
<button
class=${classMap({ active: active, inactive: !active })}
@click=${() => setActive(!active)}
>
${active ? 'Включено' : 'Выключено'}
</button>
`;
}
customElements.define('toggle-button', component(ToggleButton));
Пример 2. Условное применение нескольких классов:
const classes = {
primary: true,
rounded: false,
disabled: false
};
html`<div class=${classMap(classes)}>Контейнер</div>`;
Здесь только primary будет применён.
styleMapstyleMap предназначен для динамического управления
inline-стилями элементов. Он работает аналогично
classMap, но для CSS-свойств.
import { html } from 'haunted';
import { styleMap } from 'lit-html/directives/style-map.js';
const template = (width, height, color) => html`
<div style=${styleMap({ width: `${width}px`, height: `${height}px`, backgroundColor: color })}>
Прямоугольник
</div>
`;
Объект ключ-значение:
backgroundColor, fontSize).'100px', 'red').Позволяет легко менять стили динамически, избегая ручного объединения строк.
Пример 1. Динамическое изменение размеров элемента:
import { component, useState } from 'haunted';
function ResizableBox() {
const [size, setSize] = useState(100);
return html`
<div
style=${styleMap({ width: `${size}px`, height: `${size}px`, backgroundColor: 'blue' })}
@click=${() => setSize(size + 20)}
></div>
`;
}
customElements.define('resizable-box', component(ResizableBox));
Пример 2. Динамическая смена цвета и шрифта:
const styles = {
color: 'white',
backgroundColor: 'green',
fontSize: '20px',
padding: '10px'
};
html`<p style=${styleMap(styles)}>Текст с динамическими стилями</p>`;
classMap и styleMapОбе директивы могут использоваться вместе для максимальной гибкости:
import { html } from 'haunted';
import { classMap } from 'lit-html/directives/class-map.js';
import { styleMap } from 'lit-html/directives/style-map.js';
const template = (active, color) => html`
<button
class=${classMap({ active: active, disabled: !active })}
style=${styleMap({ backgroundColor: color, padding: '12px 24px' })}
>
Кнопка
</button>
`;
Здесь:
classMap управляет состояниями (active/disabled).styleMap задаёт цвет и внутренние отступы.Реактивность: Изменение объекта, переданного в
classMap или styleMap, автоматически приводит
к обновлению DOM, если объект используется внутри
Haunted-шаблона.
Использование camelCase для
styleMap: CSS-свойства, содержащие дефисы
(background-color), должны записываться в camelCase
(backgroundColor).
Избегать вычисления строк вручную: Директивы упрощают код, предотвращая ошибки в конкатенации и дублирование.
Совместимость с Lit-html: Haunted использует
lit-html под капотом, поэтому любые примеры из документации
lit-html для classMap и styleMap
применимы и здесь.
classMap позволяет управлять CSS-классами через объект
с булевыми значениями.styleMap упрощает динамическое добавление inline-стилей
через объект ключ-значение.Они становятся особенно полезными в больших проектах, где количество состояний и вариаций стилей значительное, и упрощают поддержку кода.