Я пытаюсь создать компонент React 16.13.0 Fla sh, для которого я хотел бы постепенно появляться и исчезать предупреждающее сообщение (например, чтобы сообщить пользователю, что что-то было успешно сохранено). Я использую CSSTransitionGroup, чтобы попытаться сделать это. Я построил этот компонент Fla sh
import React, { useEffect, useState } from "react";
import Bus from "../Utils/Bus";
import { CSSTransition } from "react-transition-group";
import "./index.css";
export const Flash = () => {
let [visibility, setVisibility] = useState(false);
let [message, setMessage] = useState("");
let [type, setType] = useState("");
useEffect(() => {
Bus.addListener("flash", ({ message, type }) => {
setVisibility(true);
setMessage(message);
setType(type);
setTimeout(() => {
setVisibility(false);
}, 4000);
});
}, []);
useEffect(() => {
if (document.querySelector(".close") !== null) {
document
.querySelector(".close")
.addEventListener("click", () => setVisibility(false));
}
});
return (
visibility && (
<CSSTransition in={visibility} timeout={300} classNames="sample">
<div className={`alert alert-${type}`}>
<span className="close">
<strong>X</strong>
</span>
<p>{message}</p>
</div>
</CSSTransition>
)
);
};
и использую следующие CSS ...
.alert {
color: white;
border-radius: 10px;
position: absolute;
top: 50px;
padding: 20px;
width: 100%;
display: flex;
align-items: center;
z-index: 1111;
}
.alert p {
margin: 0;
}
.alert-error {
background: lightcoral;
}
.alert-success {
background: lightgreen;
}
.close {
color: white;
cursor: pointer;
margin-right: 10px;
}
.sample-enter {
opacity: 0;
}
.sample-enter-active {
opacity: 0.5;
transition: opacity 300ms;
}
.sample-enter-done {
opacity: 1;
}
.sample-exit {
opacity: 1;
}
.sample-exit-active {
opacity: 0.5;
transition: opacity 300ms;
}
.sample-exit-done {
opacity: 0;
}
Однако сообщение появляется без затухания, а затем исчезает без затухания. Я не уверен, что еще делаю не так или что нужно добавить.