Ответ
Ответ не найден
Ответ 18+ 🔞
Да ты посмотри, какой этот useEffect из React оказался хитрожопым! Вроде бы пишешь его, чтобы данные подгрузить при первом рендере, а он тебе, сука, срабатывает на каждый чих — на каждое изменение любой переменной из массива зависимостей. И ведь не предупредит, подлец, просто начнёт хуярить запросы на сервер, как ненормальный!
Вот смотри, классический пиздец новичка:
useEffect(() => {
fetch('/api/data')
.then(response => response.json())
.then(data => setData(data));
}, []);
Вроде всё гуд, массив зависимостей пустой — значит, запустится один раз, как и задумано. Ан нет! Если внутри этого эффекта используется какая-то хуйня из внешнего скоупа (например, пропс или стейт), и она меняется, то эффект-то про это нихуя не узнает! Он как был застывшим куском прошлого, так и останется. И будет он там старые, неактуальные данные использовать, а ты потом голову ломаешь: "Чего это у меня интерфейс не обновляется, ёпта?!"
А бывает наоборот — забудешь массив зависимостей указать совсем. Ну, думаешь, и так сойдёт. А он, блядь, начнёт запускаться после КАЖДОГО рендера компонента! Представляешь? Каждый раз, когда мышкой шевельнёшь, он новый запрос на бэкенд шлёт. Сервер, бедолага, просто охренеет от такого напора, а в консоли у тебя — овердохуища одинаковых запросов. Красота, блядь, да и только!
Или вот ещё прикол: суёшь в зависимости объект или массив. А они в JavaScript, сволочи, сравниваются по ссылке, а не по значению. Создали новый массив на каждом рендере — для React это уже другая хуйня, совсем новая! И эффект снова запустится, хотя содержимое массива могло не измениться ни на йоту. Пиздец, да? Надо либо примитивы туда пихать, либо использовать useMemo или useCallback, чтобы ссылки не прыгали, как угорелые.
Короче, useEffect — это такая банка с пауками. Откроешь её неаккуратно — получишь неожиданных жучков и неконтролируемое ебалово в коде. Главное правило — всегда чётко понимать, что ты в этот массив зависимостей засовываешь и зачем. А если ничего не нужно — оставляй пустым. И да, иногда лучше вообще без него обойтись, если можно данные через пропсы или контекст прокинуть. А то ведь и до бесконечного лупа недалеко, а там и браузер пользователю ебнет кирпичом.