Haunted — это библиотека для создания веб-компонентов с использованием функционального подхода и хуков, вдохновлённых React. Понимание жизненного цикла компонентов является ключевым для правильного управления состоянием, эффектами и производительностью.
Каждый веб-компонент в Haunted создаётся через функцию
component, которая принимает функцию рендера и возвращает
класс, наследующийся от HTMLElement. При создании
экземпляра компонента вызывается конструктор, но рендеринг ещё не
происходит.
import { component, html, useState } from 'haunted';
function MyComponent() {
const [count, setCount] = useState(0);
return html`
<div>
<p>Счёт: ${count}</p>
<button @click=${() => setCount(count + 1)}>Увеличить</button>
</div>
`;
}
customElements.define('my-component', component(MyComponent));
Особенности этапа создания:
Метод connectedCallback вызывается каждый раз, когда
компонент вставляется в DOM. В Haunted этот этап управляется
автоматически, но важно понимать его для работы с эффектами и
подписками.
function MyComponent() {
useEffect(() => {
console.log('Компонент добавлен в DOM');
return () => console.log('Компонент удалён из DOM');
}, []);
return html`<p>Пример</p>`;
}
Ключевые моменты connectedCallback:
[] выполняются
один раз при монтировании.useEffect позволяет корректно
очищать ресурсы при удалении компонента.Обновление происходит при изменении состояния через хуки
useState или useReducer. Haunted повторно
вызывает функцию рендера и дифференцирует DOM, обновляя только
изменившиеся части.
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`Счёт обновился: ${count}`);
}, [count]);
return html`
<div>
<p>Счёт: ${count}</p>
<button @click=${() => setCount(count + 1)}>+</button>
</div>
`;
}
Особенности обновления:
Метод disconnectedCallback вызывается при удалении
компонента из DOM. В Haunted он управляет очисткой эффектов и подписок,
возвращённых функциями из useEffect.
useEffect(() => {
const interval = setInterval(() => console.log('Тик'), 1000);
return () => clearInterval(interval); // Очистка при удалении компонента
}, []);
Особенности отключения:
disconnectedCallback может вызываться несколько
раз, если элемент многократно вставляется и удаляется.Haunted позволяет связывать атрибуты элемента с состоянием через хуки или напрямую через рендер:
function MyComponent({ name }) {
return html`<p>Привет, ${name}</p>`;
}
props.useEffect можно использовать для реакции на
изменения конкретных пропсов.Эффекты в Haunted являются основным инструментом управления жизненным
циклом. useEffect поддерживает:
[]).[dep1, dep2]).Для частых эффектов с асинхронными операциями рекомендуется
использовать комбинацию useEffect и
AbortController или clearTimeout для
предотвращения гонок и утечек.
Haunted использует виртуальный DOM и повторный рендер только изменившихся частей. Для оптимизации:
useEffect корректно, чтобы
эффекты не вызывались лишний раз.Эти механизмы позволяют строить управляемые, производительные и легко поддерживаемые веб-компоненты, полностью интегрированные с современными подходами функционального программирования.