Haunted — это лёгкая библиотека для создания веб-компонентов на базе Web Components и функционального подхода, основанного на хуках. Один из ключевых аспектов разработки с Haunted — это управление состоянием и эффективная реактивная отрисовка. Интерполяция значений играет центральную роль в динамическом обновлении интерфейса, связывая состояние компонента с его представлением.
В Haunted данные из состояния компонента интегрируются в разметку через шаблонные литералы и специальные директивы. Например:
import { html, render } from 'haunted';
const Counter = () => {
const [count, setCount] = useState(0);
return html`
<div>Текущее значение: ${count}</div>
<button @click=${() => setCount(count + 1)}>Увеличить</button>
`;
};
customElements.define('my-counter', haunted(Counter));
Здесь ${count} — это простейшая форма интерполяции.
Любое изменение состояния count автоматически приведёт к
повторной отрисовке этого фрагмента.
В Haunted можно использовать не только переменные, но и выражения:
html`<div>${count % 2 === 0 ? 'Чётное' : 'Нечётное'}</div>`;
Это позволяет интегрировать логические условия, арифметические операции и вызовы функций прямо в шаблон, что делает разметку динамичной без дополнительного кода для управления DOM.
Особое внимание стоит уделить связыванию данных с атрибутами
элементов. Стандартная синтаксис ${} внутри строки атрибута
не всегда обеспечивает реактивность, поэтому Haunted использует
специальные подходы:
html`<input .value=${inputValue} @input=${e => setInputValue(e.target.value)} />`
.value=${inputValue} — связывание свойства элемента, а
не HTML-атрибута. Это обеспечивает корректное обновление значения
input.@input=${...} — привязка событий с использованием
декларативного синтаксиса Haunted.Использование свойств элементов вместо атрибутов
важно для элементов, которые управляют внутренним состоянием, таких как
<input>, <textarea>,
<select>.
Haunted позволяет динамически рендерить коллекции данных с помощью интерполяции массивов:
const items = ['Яблоко', 'Банан', 'Вишня'];
html`
<ul>
${items.map(item => html`<li>${item}</li>`)}
</ul>
`;
map() возвращает массив шаблонов `html```,
который Haunted автоматически объединяет и рендерит.Можно использовать интерполяцию для включения других веб-компонентов:
const ItemComponent = ({ name }) => html`<span>${name}</span>`;
customElements.define('item-component', haunted(ItemComponent));
html`
<div>
${items.map(item => html`<item-component .name=${item}></item-component>`)}
</div>
`;
В этом случае каждый компонент получает свои собственные свойства, обеспечивая модульность и реактивность на уровне дочерних компонентов.
Интерполяция применяется не только к контенту и атрибутам, но и к стилям:
const isActive = true;
html`<div style=${`color: ${isActive ? 'green' : 'red'};`}>Статус</div>`;
Haunted строится вокруг хуков, таких как useState и
useEffect. Интерполяция напрямую зависит от состояния:
const Timer = () => {
const [time, setTime] = useState(0);
useEffect(() => {
const id = setInterval(() => setTime(t => t + 1), 1000);
return () => clearInterval(id);
}, []);
return html`<div>Прошло секунд: ${time}</div>`;
};
customElements.define('my-timer', haunted(Timer));
time автоматически обновляет DOM в
месте интерполяции.Для больших приложений рекомендуется:
repeat, для больших массивов вместо стандартного
map().Эти возможности делают Haunted мощным инструментом для построения динамических, модульных и реактивных веб-компонентов на чистом JavaScript.