Я пытаюсь выяснить новый useEffect
" крючок" React, используя его для управления модальным входом и выходом из DOM с некоторой анимацией.
Вот рабочий код:
https://codepen.io/nicholasstephan/pen/roprgw
и упрощенная версия:
const isOpen = props.isOpen;
const [ animState, setAnimState ] = useState(null);
useEffect(() => {
if(isOpen === true && animState === null) {
setAnimState('entering');
}
if(isOpen === true && animState === 'entering') {
setAnimState('entered');
}
}, [isOpen, animState]);
if(animState === null) {
return null;
}
return (
<div
style={{
opacity: animState === 'entered' ? 1 : 0,
transition: 'opacity 200ms ease-in-out'
}}>
...
</div>
);
Я думаю:
На начальном рендере animState
равно null
, поэтому мы возвращаем null
.
Когда для isOpen задано значение true, эффект срабатывает и выполняется первое условие, устанавливая animState
на «вход».В этом состоянии компонент должен вернуть некоторое значение DOM с непрозрачностью 0
.
Эффект срабатывает снова, и выполняется второе условие, устанавливая animState
в 'Введено'.Создание DOM с непрозрачностью 1
, анимированной с помощью CSS-перехода.
Проблема, насколько я могу судить, заключается в том, что DOM добавляется с непрозрачностью 1, как будто React пакетирует несколько вызовов рендеринга и обновляет DOM только один раз.,Если вы заглянете в кодовое окно, я записываю animState
на каждом рендере, а «закрытое» состояние - это логирование, но, похоже, это не рендеринг.
Может ли это иметь место?Как мне убедиться в том, что рендер произошел до того, как снова запустить эффект?
Мне было бы интересно услышать, если есть какой-то лучший способ сделать что-то подобное?Но мне также любопытно, что React делает здесь за кадром и почему я не получаю анимацию входа.