Добавить анимацию/переход к элементу при удалении из DOM

У меня есть компонент React для элемента сообщения об ошибке ErrorMessage, который либо возвращает элемент div с дочерними элементами, либо возвращает null, поэтому он удаляется из DOM.

Мне было любопытно, есть ли способ с помощью CSS/React анимировать этот элемент, когда он удаляется из DOM? Я могу анимировать, когда он хорошо отображается.

Вот КодПесочница для проверки.

Вот мой САС

.ErrorMessages {
  background: #ee4900;
  color: #fff;
  border: 0;
  color: #fff;
  padding: 0.8em 1em;
  text-align: left;
  font-size: 12px;
  margin-top: 10px;
  margin-bottom: 10px;
  animation-duration: 0.5s;
  animation-fill-mode: both;
  animation-name: fadeInUp;
}

.ErrorMessages--Centered {
  padding-top: 30px;
  padding-right: 70px;
  padding-left: 70px;
}

.ErrorMessages--fadeOut {
  animation-name: fadeOutDown;
}

@keyframes fadeOutDown {
  from {
    opacity: 1;
    max-height: 72px;
  }

  to {
    opacity: 0;
    padding: 0;
    margin: 0;
    max-height: 0;
    transform: translate3d(0, 50px, 0);
  }
}

@keyframes fadeInUp {
  from {
    opacity: 0;
    padding: 0;
    margin: 0;
    max-height: 0;
    transform: translate3d(0, 50px, 0);
  }
  to {
    opacity: 1;
  }
}

Ниже мой компонент ErrorMessage

import React from "react";

const ErrorMessage = props => {
  let err = props.show ? (
    <div className = "ErrorMessages ErrorMessages--Centered">
      <h4>{props.errorHeader}</h4>
      <p>{props.errorMessage}</p>
    </div>
  ) : null;
  return err;
};

export default ErrorMessage;

Который отображается в DOM как

<div class = "ErrorMessages ErrorMessages--Centered"></div>

Любая помощь будет принята с благодарностью!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
5 430
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не сможете анимировать его, не задерживая размонтирование компонента - в противном случае компонента технически больше нет, и поэтому вы не сможете добавить какую-либо анимацию/переход на его выходе.

Лично я считаю, что группа react-transition очень хорошо справляется с анимацией.

https://github.com/reactjs/реакт-переход-группа

Затем вы можете использовать что-то вроде:

<TransitionGroup>
    {this.state.showError && 
    <CSSTransition className='animate-error' timeout = {{enter: 500, exit: 500}}>
        <ErrorMesage ... />
    </CSSTransition>
    }
</TransitionGroup>

и управлять состояниями следующим образом:

.animate-error-enter .ErrorMessages.ErrorMessages--Centered { 
    the styles for the initial state of your animation/transition before it enters
}

.animate-error-enter-done .ErrorMessages.ErrorMessages--Centered { 
    the styles you animate to on enter 
}

.animate-error-exit .ErrorMessages.ErrorMessage--Centered { 
    the styles you animate to on exit in order to hide the component 
}

Время ожидания входа и выхода должно быть равно длительности вашей анимации/перехода для входа и выхода.

Ответ принят как подходящий

Вы можете setTimeout и поднять флаг анимации, когда props.show изменится. Что-то вроде этого:

const ErrorMessage = props => {
  const [show, setShow] = useState(props.show);
  const [hide, setHide] = useState(!props.show);
  const timeoutRef = useRef(null);

  useEffect(() => {
    if (props.show) {
      setShow(true);
      setHide(false);
      clearTimeout(timeoutRef.current);
    }
    else {
      setShow(false);
      timeoutRef.current = setTimeout(() => setHide(true), props.delay || 1000);
    }
  }, [props.show]);

  /* unmount cleanup */
  useEffect(() => () => clearTimeout(timeoutRef.current), []);

  let err = !hide ? (
    <div className = {'ErrorMessages ErrorMessages--Centered' + (show ? '' : ' ErrorMessages--fadeOut')}>
      <h4>{props.errorHeader}</h4>
      <p>{props.errorMessage}</p>
    </div>
  ) : null;
  return err;
};

Это идеально, спасибо! Работает как шарм, не думал об использовании тайм-аута!

mcclosa 28.03.2019 14:02

Другие вопросы по теме