Моим решением было смешать React Pose с React Visibility.
Видимость запускает анимацию в React Pose, которая происходит только один раз. Анимация основана на позе, а не на видимости.
import VisibilitySensor from 'react-visibility-sensor';
import posed from 'react-pose';
const PoseDiv = posed.div({
enter: {
y: 0,
opacity: 1,
transition: {
duration: 300,
ease: 'easeIn',
},
},
exit: { y: 20, opacity: 0 },
});
export const SlideUp = ({ children }) => {
const [isVisible, setVisibility] = useState(false);
const [entered, setEntered] = useState(false);
const onChange = visiblity => {
setVisibility(visiblity);
};
useEffect(() => {
if (isVisible) {
setEntered(true);
}
}, [isVisible]);
return (
<>
<VisibilitySensor
partialVisibility
offset={{ top: 100 }}
onChange={onChange}
>
<PoseDiv pose={entered ? 'enter' : 'exit'}>{children}</PoseDiv>
</VisibilitySensor>
</>
);
};
Надеюсь, она поможет кому-то еще. Ура! * * 1006