Как в React при размонтировании компонента отложить этот процесс на некоторое время?

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

 useEffect(() => {
   return () => { 
       while(true) { }
   }
 );

Ответы (1 шт):

Автор решения: Smeto

Чем такой вариант плох?

import { useState, useEffect } from "react";

function CollapsibleComponent() {
  const [isVisible, setIsVisible] = useState(true);
  const [shouldRender, setShouldRender] = useState(true);

  const closeWithAnimation = () => {
    setIsVisible(false); // Запускаем анимацию (max-height: 0)
    
    // Ждём окончания анимации (например, 300ms)
    setTimeout(() => {
      setShouldRender(false); // Удаляем из DOM
    }, 300);
  };

  if (!shouldRender) return null; // Компонент удалён из DOM

  return (
    <div>
      Контент, который нужно анимировать
      <button onClick={closeWithAnimation}>Закрыть</button>
    </div>
  );
}

Под любой компонент даже внешний

import { useState } from "react";
import Grundy from "Grundy";

function WrappedComponent() {
  const [shouldRender, setShouldRender] = useState(true);
  const [isVisible, setIsVisible] = useState(true);

  const closeWithAnimation = () => {
    setIsVisible(false);
    setTimeout(() => setShouldRender(false), 300);
  };

  if (!shouldRender) return null;

  return (
    <div style={{
      transition: "opacity 300ms, max-height 300ms",
      opacity: isVisible ? 1 : 0,
      maxHeight: isVisible ? "1000px" : "0px",
      overflow: "hidden"
    }}>
      <Grundy />
      <button onClick={closeWithAnimation}>Закрыть</button>
    </div>
  );
}
→ Ссылка