← Назад ко всем вопросам

Какие этапы жизненного цикла классового компонента можно реализовать через useEffect? Как зависят вызовы эффекта от массива зависимостей?

1️⃣ Как кратко ответить

Через useEffect можно реализовать этапы жизненного цикла классового компонента: componentDidMount, componentDidUpdate и componentWillUnmount. Вызовы эффекта зависят от массива зависимостей: пустой массив — эффект вызывается только при монтировании, массив с зависимостями — эффект вызывается при изменении этих зависимостей, отсутствие массива — эффект вызывается при каждом рендере.

2️⃣ Подробное объяснение темы

В React классовые компоненты имеют несколько этапов жизненного цикла, которые позволяют выполнять определенные действия в определенные моменты времени. Эти этапы включают в себя:

  • componentDidMount: вызывается после того, как компонент был добавлен в DOM.
  • componentDidUpdate: вызывается после обновления компонента.
  • componentWillUnmount: вызывается перед удалением компонента из DOM.

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

Реализация этапов жизненного цикла через useEffect

  1. componentDidMount: Чтобы реализовать этот этап, используйте useEffect с пустым массивом зависимостей. Это гарантирует, что эффект выполнится только один раз после первого рендера.

    import React, { useEffect } from 'react';
    ​
    function MyComponent() {
      useEffect(() => {
        // Код, который выполняется только при монтировании компонента
        console.log('Component mounted');
    ​
        // Возвращаемая функция выполняется при размонтировании
        return () => {
          console.log('Component will unmount');
        };
      }, []); // Пустой массив зависимостей
    ​
      return <div>My Component</div>;
    }
    
    • useEffect вызывается после первого рендера.
    • Пустой массив [] указывает, что эффект не зависит от каких-либо изменений и должен выполниться только один раз.
  2. componentDidUpdate: Чтобы реализовать этот этап, укажите зависимости в массиве. Эффект будет вызываться каждый раз, когда изменяется хотя бы одна из зависимостей.

    import React, { useState, useEffect } from 'react';
    ​
    function MyComponent() {
      const [count, setCount] = useState(0);
    ​
      useEffect(() => {
        // Код, который выполняется при изменении count
        console.log(`Count updated: ${count}`);
      }, [count]); // Зависимость от count
    ​
      return (
        <div>
          <p>Count: {count}</p>
          <button onClick={() => setCount(count + 1)}>Increment</button>
        </div>
      );
    }
    
    • useEffect вызывается после каждого изменения count.
    • Массив [count] указывает, что эффект зависит от count.
  3. componentWillUnmount: Чтобы реализовать этот этап, верните функцию из useEffect. Эта функция будет вызвана перед тем, как компонент будет удален из DOM.

    import React, { useEffect } from 'react';
    ​
    function MyComponent() {
      useEffect(() => {
        // Код, который выполняется при монтировании
    ​
        return () => {
          // Код, который выполняется при размонтировании
          console.log('Component will unmount');
        };
      }, []); // Пустой массив зависимостей
    ​
      return <div>My Component</div>;
    }
    
    • Возвращаемая функция из useEffect выполняется при размонтировании компонента.
    • Это полезно для очистки, например, таймеров или подписок.

Зависимость вызовов эффекта от массива зависимостей

  • Пустой массив []: Эффект выполняется только один раз после монтирования компонента.
  • Массив с зависимостями [dep1, dep2, ...]: Эффект выполняется после монтирования и каждый раз, когда изменяется хотя бы одна из зависимостей.
  • Отсутствие массива: Эффект выполняется после каждого рендера, что может привести к снижению производительности.

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

Тема: React
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки