Ответ
useEffect — это хук в React, позволяющий выполнять побочные эффекты в функциональных компонентах. Он заменяет методы жизненного цикла (componentDidMount, componentDidUpdate, componentWillUnmount).
Основные случаи использования:
- Запросы к API.
- Подписки на события.
- Работа с DOM.
Синтаксис:
useEffect(() => {
// Эффект выполнится после рендера
return () => {
// Очистка (аналог componentWillUnmount)
};
}, [dependencies]); // Зависимости для контроля выполнения
Пример:
import { useEffect, useState } from 'react';
function Example() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://api.example.com/data')
.then(res => res.json())
.then(setData);
}, []); // Пустой массив = эффект только при монтировании
return <div>{data ? data.message : 'Loading...'}</div>;
}
Важно:
- Без зависимостей эффект выполняется после каждого рендера.
- Пустой массив
[]— только при монтировании. - Указанные зависимости — при их изменении.
Ответ 18+ 🔞
А, ну это же тот самый useEffect, про который все так пиздят! Слушай, это как волшебная палочка в Реакте, только вместо «вингардиум левиоса» — хуй с горой асинхронного кода.
Короче, представь: у тебя есть функциональный компонент, и тебе надо накостылить какую-нибудь побочную хуйню — данные с сервака стянуть, на событие подписаться или DOM поковырять. Раньше для этого были эти ёбаные методы жизненного цикла в классах: componentDidMount, componentDidUpdate. Сейчас же всё проще — один хук useEffect на все случаи жизни, как швейцарский нож, блядь.
Вот смотри, как он выглядит, этот красавец:
useEffect(() => {
// Тут твоя магия, которая сработает после того, как компонент отрендерится
// Например, запрос на сервер, подписка на событие, таймер
return () => {
// А это — опциональная функция очистки. Как componentWillUnmount, только круче.
// Тут отписываешься от всего, чистишь таймеры, чтобы память не текла.
};
}, [dependencies]); // А вот это, сука, самое важное — массив зависимостей.
Теперь про массив зависимостей, а то тут многие ебут мозг. Это как кнопка «повтор» на плеере:
- Нет массива вообще — эффект будет срабатывать после КАЖДОГО рендера. Осторожно, а то заебёшь сервер запросами или устроишь бесконечный цикл, ёпта!
- Пустой массив
[]— эффект выполнится только один раз, при монтировании компонента. Идеально для начальной загрузки данных. - В массиве указаны переменные
[a, b]— эффект будет перезапускаться только когда меняетсяaилиb. Умно, да?
Вот живой пример, чтобы не быть пиздаболом:
import { useEffect, useState } from 'react';
function Example() {
const [data, setData] = useState(null);
useEffect(() => {
// Эффект с пустым массивом зависимостей — сработает один раз, при первом рендере.
fetch('https://api.example.com/data')
.then(res => res.json())
.then(setData);
}, []);
return <div>{data ? data.message : 'Загружаю, погоди, сука...'}</div>;
}
Или вот пример с подпиской и очисткой — чтобы не было утечек памяти, как в дырявом тазу:
useEffect(() => {
const handleResize = () => {
console.log('Окно изменилось, блядь!');
};
window.addEventListener('resize', handleResize);
// Функция очистки — отписываемся при размонтировании компонента
return () => {
window.removeEventListener('resize', handleResize);
};
}, []);
Главное — не забывай про зависимости, а то будет как в том анекдоте: «запустил эффект, а он тебе в ответ — я тебя ебал, буду выполняться вечно». Чих-пых тебя в сраку, если забудешь!