У меня есть компонент 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>
Любая помощь будет принята с благодарностью!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы не сможете анимировать его, не задерживая размонтирование компонента - в противном случае компонента технически больше нет, и поэтому вы не сможете добавить какую-либо анимацию/переход на его выходе.
Лично я считаю, что группа 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;
};
Это идеально, спасибо! Работает как шарм, не думал об использовании тайм-аута!