Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: useEffect, cleanup function, React hooks, component lifecycle

Как реализовать аналог componentWillUnmount в функциональном компоненте?

Этот вопрос проверяет понимание жизненного цикла компонентов в React и умение заменять методы жизненного цикла классовых компонентов на хуки в функциональных.

Короткий ответ

В функциональных компонентах React аналогом `componentWillUnmount` является функция очистки, возвращаемая из хука `useEffect`. Хук `useEffect` позволяет выполнять побочные эффекты. Если вы возвращаете функцию из его колбэка, React выполнит её при размонтировании компонента. Это идеальное место для отписки от событий, отмены таймеров или очистки ресурсов.

Длинный ответ

В классовых компонентах React метод componentWillUnmount используется для очистки ресурсов перед удалением компонента из DOM. В функциональных компонентах, использующих хуки, эта логика реализуется с помощью хука useEffect.

Как работает useEffect с очисткой

Хук useEffect принимает два аргумента: функцию-эффект и необязательный массив зависимостей. Если функция-эффект возвращает другую функцию, то возвращённая функция выполняется React для очистки. Эта очистка происходит в двух случаях: непосредственно перед следующим выполнением того же эффекта (если зависимости изменились) и при размонтировании компонента.

Практический пример

Рассмотрим компонент, который подписывается на внешнее событие, например, на изменение размера окна. При размонтировании подписку необходимо удалить, чтобы избежать утечек памяти.

import React, { useState, useEffect } from 'react';

function WindowSizeTracker() {
  const [windowWidth, setWindowWidth] = useState(window.innerWidth);

  useEffect(() => {
    // Эффект: подписываемся на событие
    const handleResize = () => setWindowWidth(window.innerWidth);
    window.addEventListener('resize', handleResize);

    // Функция очистки: аналог componentWillUnmount
    return () => {
      window.removeEventListener('resize', handleResize);
      console.log('EventListener удалён, компонент размонтируется.');
    };
  }, []); // Пустой массив зависимостей = эффект выполнится только при монтировании

  return Ширина окна: {windowWidth}px;
}

Ключевые моменты

  • Пустой массив зависимостей ([]) гарантирует, что эффект (и очистка) выполнится только один раз при монтировании/размонтировании.
  • Массив с зависимостями заставит React выполнять очистку перед каждым новым выполнением эффекта, если зависимости изменились.
  • Функция очистки имеет доступ к замыканию (значениям переменных и пропсов) на момент создания эффекта, что помогает избежать "устаревших" значений.

Вывод: Используйте возвращаемую функцию из useEffect для любой логики очистки (отмена сетевых запросов, таймеров, подписок). Это основной и единственный способ имитировать componentWillUnmount в функциональных компонентах React.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • React

    React

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

#useEffect

#cleanup function

#React hooks

#component lifecycle

Подпишись на React Developer в телеграм