Пример - это функциональный компонент, в котором я отображаю div
условно. Я хочу, чтобы это div
до постепенного появления при визуализации условно и постепенного исчезновения наоборот.
Для этого я сохранил две локальные переменные состояния: render
и fadeIn
, которые вычисляются на основе show
реквизита, переданного компоненту Example .
То, что я сделал, это:
- Когда
show
поддержать его true , я устанавливаю render
как true , поэтому div
визуализируется условно и по истечении времени ожидания 10ms
I установите fadeIn
как true , что установит CSS имя класса для моего div как show
. - Когда
show
prop it false , я установил fadeIn
как false , который установит CSS имя класса для моего div как hide
и после тайм-аута 200ms
(время перехода в CSS) я установлю render
как false , поэтому div
условно скрыт.
Код:
interface Props {
show: boolean;
}
const Example: React.FC<Props> = ({ show, }) => {
const [render, setRender] = useState(false);
const [fadeIn, setFadeIn] = useState(false);
useEffect(() => {
if (show) {
// render component conditionally
setRender(show);
// change state to for conditional CSS classname which will
// animate opacity, I had to give a timeout of 10ms else the
// component shows up abruptly
setTimeout(() => {
setFadeIn(show);
}, 10);
} else {
// change state to change component classname for opacity animation
setFadeIn(false);
// hide component conditionally after 200 ms
// because that's the transition time in CSS
setTimeout(() => {
setRender(false);
}, 200);
}
}, [
show,
]);
return (
<div>
{render && (
<div className={`container ${fadeIn ? 'show' : 'hide'}`} />
)}
</div>
);
};
Таблица стилей:
.container {
width: 100px;
height: 100px;
background-color: black;
transition: opacity 0.2s ease;
}
.show {
opacity: 1;
}
.hide {
opacity: 0;
}
Я считаю, что это не очень хорошая практика кодирования для AC достичь функциональности и должен поддерживать только одно локальное состояние в моем компоненте. Мне нужны ваши предложения о том, как я могу решить эту проблему лучшим способом без использования сторонней библиотеки . Спасибо:)