ГлавнаяБлогTech UpdatesВывод useEffect Выполнен Дважды и Он Нашел Истинную Баг
Tech Updates5 сентября 2026 г.3 мин

Вывод useEffect Выполнен Дважды и Он Нашел Истинную Баг

useEffect Fired Twice and It Found a Real Bug ## Введение Когда вы работаете с React, особенно в версии 18 и выше, вы можете столкнуться с проблемой, когда `useEffect`...

useEffect Fired Twice and It Found a Real Bug

Введение

Когда вы работаете с React, особенно в версии 18 и выше, вы можете столкнуться с проблемой, когда useEffect вызывается дважды при монтировании компонента. Это может быть неверно воспринято как баг в вашем коде, но на самом деле это функциональность Strict Mode, предназначенная для обнаружения эффектов, которые не правильно очищаются после завершения работы.

Проблема и первоначальное восприятие

В одном из проектов мы столкнулись с проблемой, когда API-запрос внутри useEffect выполнялся дважды при каждом монтировании компонента в режиме разработки. В результате мы получали дублирующиеся записи в таблице, что было недопустимым поведением для страницы загрузки ресурса.

Пример кода

useEffect(() => {
  console.log('mount'); // logs twice in dev, once in production
  const subscription = subscribeToUpdates();
  // no cleanup — this is the actual problem
}, []);

Почему это происходит?

React 18 включает в себя Strict Mode, который в режиме разработки повторно монтирует и демонтирует каждый компонент один раз. Это делается для того, чтобы выявить эффекты, которые не правильно очищаются после завершения своей работы. В данном случае, повторный вызов useEffect в Strict Mode не является багом вашего кода, а скорее указывает на то, что вы забыли очистить ресурсы после завершения работы эффекта.

Как это влияет на производство?

В производственных сборках этот двойной вызов useEffect не происходит. Таким образом, проблемы, которые вы обнаруживаете в режиме разработки, могут проявиться только в производственной среде под определенными условиями.

Пример кода для производственной среды

if (process.env.NODE_ENV !== 'production') {
  useEffect(() => {
    console.log('mount'); // logs twice in dev, once in production
    const subscription = subscribeToUpdates();
    return () => {
      subscription.unsubscribe(); // Add cleanup logic here
    };
  }, []);
}

Почему это не шумит и стоит ли его подавлять?

Эта функциональность Strict Mode не является шумом или бесполезным сообщением, которое следует игнорировать. Она предназначена для того, чтобы обнаруживать эффекты, которые могут быть неправильно очищены и привести к проблемам в будущем. Если эффект правильно очищается, он будет безопасно перезагружаться при повторном монтировании компонента.

Советы по написанию корректного кода

  1. Добавьте логику очистки: Убедитесь, что вы добавили логику очистки для всех ресурсов, которые были инициализированы внутри useEffect.
  2. Проверьте зависимости: Убедитесь, что зависимости в массиве зависимостей (deps array) корректны и отражают все изменения, которые должны триггерить перезагрузку эффекта.
  3. Используйте функцию cleanup: Возвращайте функцию очистки из useEffect, чтобы освободить ресурсы при деструктурировании эффекта.

Заключение

Повторный вызов useEffect в режиме разработки – это не баг вашего кода, а функциональность Strict Mode, предназначенная для выявления эффектов, которые могут быть неправильно очищены. Чтобы избежать проблем в будущем, убедитесь, что вы добавили логику очистки для всех ресурсов и проверили зависимости в массиве зависимостей.

SEO Заголовок

useEffect вызывается дважды: почему и как исправить

SEO Описание

Узнайте, почему useEffect вызывается дважды в режиме разработки и как исправить эту проблему, чтобы избежать дублирующих записей в таблице.

SEO Ключевые слова

React, useEffect, Strict Mode, дублирующие записи, таблица

Теги

React, JavaScript, разработка, программирование, web development