TGViewer
React React @react_lib · 2.66K subscribers
Post #712 1.29K
Почему ваш useEffect лишний (и что вместо него)

Сейчас покажу 6 типичных случаев, где useEffect не нужен и только плодит баги и лишние рендеры. Дам короткие «до/после».

1. Вычисляемое из пропсов/стейта
❌ Плохо


const [fullName, setFullName] = useState('');
useEffect(() => { setFullName(`${user.first} ${user.last}`); }, [user]);


✅ Хорошо


const fullName = `${user.first} ${user.last}`;


2. Фильтрация/сортировка списка
❌ Плохо


const [filtered, setFiltered] = useState<Item[]>([]);
useEffect(() => { setFiltered(items.filter(byQuery(query))); }, [items, query]);


✅ Хорошо


const filtered = useMemo(() => items.filter(byQuery(query)), [items, query]);


3. Счётчики/таймеры для UI
❌ Плохо — пишут в стейт каждую секунду, лишний рендер
✅ Лучше — храните в useRef, рендерите только когда нужно показать новое число:


const tickRef = useRef(0);
useEffect(() => {
const id = setInterval(() => { tickRef.current++; }, 1000);
return () => clearInterval(id);
}, []);
// Когда надо отрисовать — дерните setState из контролируемой точки.


4. Синхронизация формы с данными
❌ Плохо — «заливают» в стейт через эффект
✅ Лучше — передавайте значения как defaultValue/values в форму или используйте «ключ» для ремонта формы:


<form key={user.id}>...</form>


5. Запросы данных
❌ Плохо — «сами» тащим fetch в эффект, пишем кэш, статус, отмену
✅ Лучше — вынесите в data-layer (например, TanStack Query) или хотя бы в отдельный хук с кэшем и отменой.

6. События окна/документа
Если обработчик не использует реактивные данные — храните его в useRef и вешайте один раз. Если использует — чаще всего достаточно мемоизировать колбэк и вешать/снимать один раз.


const handlerRef = useRef<(e: KeyboardEvent) => void>(() => {});
handlerRef.current = (e) => { /* читаем актуальные значения из замыканий/рефов */ };

useEffect(() => {
const onKey = (e: KeyboardEvent) => handlerRef.current(e);
window.addEventListener('keydown', onKey);
return () => window.removeEventListener('keydown', onKey);
}, []);


Мини-чеклист «нужен ли тут эффект?»

- Это побочный эффект вне React (I/O, подписка, таймер, манипуляция DOM)? → Да — useEffect.
- Это чистое вычисление на основе пропсов/стейта? → Нет эффекта, используем выражение/useMemo.
- Можно ли пересчитать при рендере без записи в стейт? → Делайте это.
- Будет ли этот эффект легко зафлапать гонками? → Пересмотрите дизайн.

✍️ @React_lib
  • ❤ 2
  • 👍 1
  • 🤔 1
More from @react_lib
  1. Sep 11, 2026🚨 Избегай монолитных компонентов, которые объединяют в себе отображение, управление состо…
  2. Sep 7, 2026❌ Избегайте использования нескольких переменных состояния для отслеживания статуса. ✅ Вмес…
  3. Aug 31, 2026Сегодня написал пост на тему, которая регулярно бьёт по скорости разработки: почему React-…
  4. Aug 24, 2026❌ Избегайте «прокидывания» пропсов (prop-drilling) для расширения компонентов ✅ Вместо это…
  5. Aug 23, 2026🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.r…
  6. Aug 21, 2026⚛️ Реактивность - это просто (и всего 35 строк кода) Мы часто воспринимаем реактивность в…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →