如果超时持续时间太短,则在 useLayoutEffect 中反应 setTimeout 不会延迟动画

React setTimeout inside useLayoutEffect not delaying animation if the timeout duration is too short

我正在尝试创建一个动画,其中文本出现在屏幕上,并且可以选择使用超时来延迟动画。

奇怪的是,当应用程序首次在浏览器上呈现时,它按预期工作,但如果我手动刷新“f5”,延迟只有在超时持续时间较长时才可见,任何值低于 500 毫秒例如,其他延迟是不可见的。

我已经尝试创建自定义挂钩,使用“useEffect”和“useLayoutEffect”,但这种奇怪的行为一直在发生。

这是组件。

const FadeInText = ({text, style, timeout, noScroll}) => {
const textRef = useRef(null)
const [visible, setVisible] = useState()
    
useLayoutEffect(() => {
    setVisible(timeout !== undefined ? {animation: "none", 
          opacity: 0} : {})
        let time = setTimeout(() => {
            setVisible({})
        }, timeout)
        return () => clearTimeout(time)
    },[timeout]) 

    return <p ref={textRef} style={{...visible,...style}} className="fade-in-text">{text}</p>
}

export default FadeInText;

这是应用于文本的 CSS 规则

@keyframes fade-slide-up {
    from {
        opacity: 0;
        transform: translateY(10px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

.fade-in-text {
    font-size: 1rem;
    color: white;
    animation: fade-slide-up 0.2s ease-in;
}

以下是我使用此组件的一些情况,唯一可见延迟的组件是超时设置为 600 的组件

            <FadeInText style={{fontSize: "5vw"}} text="R" timeout={200}  />
            <FadeInText style={{fontSize: "5vw"}} text="A" timeout={300}  />
            <FadeInText style={{fontSize: "5vw"}} text="N" timeout={400}  />
            <FadeInText style={{fontSize: "5vw"}} text="D" timeout={600}  />

使用 clearTimeout 而不是 clearInterval。 确保超时值以毫秒为单位(1000、2000、3500 ...) 没有应用 css 规则或变量值,很难提供帮助。