Haunted — это легковесная библиотека для создания веб-компонентов на базе Web Components и Hooks, вдохновлённая React. Одним из ключевых аспектов работы с хуками является корректное управление побочными эффектами, включая освобождение ресурсов и отмену подписок. Для этого используется функция очистки.
useEffect и возвращаемой функции очисткиВ Haunted хук useEffect позволяет выполнять побочные
эффекты после рендера компонента:
import { html, component, useEffect } from 'haunted';
function Timer() {
useEffect(() => {
const intervalId = setInterval(() => {
console.log('tick');
}, 1000);
// Функция очистки возвращается из useEffect
return () => {
clearInterval(intervalId);
console.log('Таймер остановлен');
};
});
return html`<p>Смотрите консоль для событий таймера</p>`;
}
customElements.define('my-timer', component(Timer));
Ключевые моменты:
useEffect создаёт
механизм очистки, который вызывается перед повторным
вызовом эффекта и при размонтировании компонента.useEffect не возвращает функцию, очистка
выполняться не будет.useEffect может принимать массив зависимостей вторым
аргументом:
useEffect(() => {
const handleResize = () => console.log(window.innerWidth);
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []); // Пустой массив — эффект выполнится один раз
Особенности:
[]), эффект
выполняется один раз при монтировании, а функция
очистки — при размонтировании.[propA, stateB]), эффект
будет повторно выполняться при изменении этих значений, а перед каждым
повторным вызовом будет вызвана функция очистки.Функция очистки особенно важна для асинхронных процессов, чтобы избежать утечек памяти и конфликтов состояния:
useEffect(() => {
let cancelled = false;
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
if (!cancelled) {
console.log('Полученные данные:', data);
}
});
return () => {
cancelled = true;
console.log('Запрос отменён');
};
}, []);
Объяснение:
cancelled позволяет игнорировать
результат запроса, если компонент размонтирован до завершения
операции.Функции очистки не ограничиваются только useEffect.
Любой хук, который создает подписки или ресурсы, может использовать
схему возврата функции очистки:
useReducer с побочными эффектами.useState в сочетании с useEffect для
синхронизации состояний.Пример пользовательского хука с очисткой:
import { useState, useEffect } from 'haunted';
function useWindowWidth() {
const [width, setWidth] = useState(window.innerWidth);
useEffect(() => {
const onRes ize = () => setWidth(window.innerWidth);
window.addEventListener('resize', onResize);
return () => window.removeEventListener('resize', onResize);
}, []);
return width;
}
Функция очистки является неотъемлемой частью эффективного управления состоянием и ресурсами в Haunted, обеспечивая корректное поведение компонентов и стабильность приложения.