Haunted — это лёгкая библиотека для создания веб-компонентов на базе
стандартов Web Components и функционального подхода, вдохновлённого
React Hooks. Один из ключевых аспектов при работе с Haunted — управление
побочными эффектами, которые возникают при изменении
состояния компонента или его жизненного цикла. Побочные эффекты могут
включать работу с DOM напрямую, подписки на события, асинхронные
операции и взаимодействие с внешними API. Для их корректного управления
в Haunted используется хук useEffect.
useEffectuseEffect позволяет выполнять код, который должен
запускаться после рендера компонента или при изменении определённых
зависимостей.
import { useEffect, html } from 'haunted';
function MyComponent({ count }) {
useEffect(() => {
console.log(`Текущее значение count: ${count}`);
}, [count]);
return html`<p>Count: ${count}</p>`;
}
Особенности useEffect:
[]), эффект выполняется
только один раз при монтировании компонента.Иногда побочные эффекты создают ресурсы, которые нужно освобождать (например, таймеры, подписки, слушатели событий). Для этого функция эффекта может возвращать функцию очистки:
function TimerComponent() {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const interval = setInterval(() => setSeconds(s => s + 1), 1000);
return () => clearInterval(interval); // Очистка при размонтировании
}, []);
return html`<p>Прошло секунд: ${seconds}</p>`;
}
Правила использования функции очистки:
В Haunted можно использовать несколько эффектов одновременно. Это особенно полезно, когда побочные эффекты различны по характеру:
function MultiEffectComponent({ count }) {
useEffect(() => {
console.log('Эффект только при монтировании');
}, []);
useEffect(() => {
console.log(`Count изменился: ${count}`);
}, [count]);
return html`<p>Count: ${count}</p>`;
}
Каждый useEffect независим и имеет собственные
зависимости, что упрощает управление сложными компонентами.
Эффекты могут включать асинхронные операции, такие как запросы к серверу. Важно помнить, что сам эффект не может быть асинхронной функцией, но внутри него можно использовать асинхронные функции:
function DataFetcher({ url }) {
const [data, setData] = useState(null);
useEffect(() => {
let canceled = false;
async function fetchData() {
const response = await fetch(url);
const result = await response.json();
if (!canceled) setData(result);
}
fetchData();
return () => { canceled = true; };
}, [url]);
return html`<pre>${JSON.stringify(data, null, 2)}</pre>`;
}
Ключевые моменты:
canceled позволяет
предотвратить обновление состояния после размонтирования
компонента.Неправильное использование эффектов может приводить к лишним рендерам и замедлению работы компонентов. Рекомендации:
В Haunted жизненный цикл компонента напрямую связан с вызовом
useEffect:
Это делает useEffect универсальным инструментом для
управления состоянием вне рендера, синхронизации с внешними ресурсами и
управления DOM напрямую.
useEffect(() => {
const onRes ize = () => console.log(window.innerWidth);
window.addEventListener('resize', onResize);
return () => window.removeEventListener('resize', onResize);
}, []);
useEffect(() => {
const ws = new WebSocket('wss://example.com/socket');
ws.onmess age = e => console.log('Новое сообщение:', e.data);
return () => ws.close();
}, []);
useEffect(() => {
let frame;
const animate = () => {
console.log('Анимация кадра');
frame = requestAnimationFrame(animate);
};
frame = requestAnimationFrame(animate);
return () => cancelAnimationFrame(frame);
}, []);
Эффективное использование побочных эффектов в Haunted позволяет создавать реактивные, производительные и безопасные веб-компоненты, легко управлять внешними ресурсами и асинхронными процессами, минимизируя ошибки и утечки памяти.