useEffect в Preact является одним из основных хуков для работы с побочными эффектами в функциональных компонентах. Его основная цель — выполнять код после того, как компонент отрендерился, а также управлять жизненным циклом этого кода при изменении зависимостей.
import { h } from 'preact';
import { useEffect } from 'preact/hooks';
useEffect(() => {
// код побочного эффекта
return () => {
// код очистки эффекта (опционально)
};
}, [dependencies]);
componentDidMount:useEffect(() => {
console.log('Компонент смонтирован');
}, []);
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`Значение count изменилось: ${count}`);
}, [count]);
useEffect(() => {
console.log('Компонент обновился');
});
Возвращаемая из useEffect функция используется для освобождения ресурсов, отписки от событий, отмены таймеров или запросов:
useEffect(() => {
const intervalId = setInterval(() => {
console.log('Таймер сработал');
}, 1000);
return () => {
clearInterval(intervalId);
console.log('Таймер очищен');
};
}, []);
Функция очистки вызывается:
useEffect не может принимать асинхронную функцию напрямую. Для выполнения асинхронного кода внутри эффекта создается вложенная функция:
useEffect(() => {
const fetchData = async () => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
};
fetchData();
}, []);
Игнорирование зависимостей Если зависимости указаны неверно или пропущены, эффект может работать некорректно. Важно включать все значения, используемые внутри эффекта, кроме констант и функций, определённых вне компонента.
Чрезмерные эффекты Использование эффекта без зависимостей для кода, который не требует постоянного выполнения, приводит к лишним рендерам и нагрузке на производительность.
Очистка ресурсов Всегда проверять, что эффекты освобождают ресурсы. Неправильная очистка может вызвать утечки памяти или некорректное поведение при размонтировании.
useEffect(() => {
const handleResize = () => console.log(window.innerWidth);
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, []);
useEffect(() => {
const timer = setTimeout(() => console.log('Прошло 3 секунды'), 3000);
return () => clearTimeout(timer);
}, []);
useEffect(() => {
document.title = `Вы нажали ${count} раз`;
}, [count]);
В Preact useEffect работает практически идентично
React, но с более лёгким и быстрым механизмом рендеринга. Отличие
заключается в том, что Preact стремится минимизировать количество
вызовов эффекта при множественных обновлениях, особенно если
используется preact/compat.
useEffect является базовым инструментом для управления побочными эффектами и синхронизации состояния с внешним миром, обеспечивая точное управление временем выполнения и очисткой ресурсов.