gpt4 book ai didi

javascript - 在 React 和 Redux 中使用 setTimeout

转载 作者:行者123 更新时间:2023-11-30 06:22:57 26 4
gpt4 key购买 nike

我有一些动画,我正尝试使用 setTimeouts 开始工作,但出于某种原因,它们会一遍又一遍地触发,直到时间结束。我有一个包含我所有 bool 值的 reducer 和一个切换它们的 Action ,但问题是无论 setTimeouts 中的条件是否为真,都会触发该 Action 。我查看了 chrome 控制台并确认这是真的,但我不知道为什么。我会将我的代码放在下面。

type LandingPagePropTypes = {
displayCommandText: boolean,
displayInstallText: boolean,
displayAboutText: boolean,
displayEnterText: boolean,
displayWelcomeHeader: boolean,
togglePropertyInState: (propertyName: string) => void,
togglePopUpModal: (message: string) => void,
};

const LandingPage = (
{
displayWelcomeHeader,
displayCommandText,
displayAboutText,
displayInstallText,
displayEnterText,
togglePropertyInState,
togglePopUpModal,
}: LandingPagePropTypes,
) => {
setTimeout(() => {
if (!displayCommandText) {
togglePropertyInState('displayCommandText');
}
}, 1000);
setTimeout(() => {
if (!displayInstallText) {
togglePropertyInState('displayInstallText');
}
}, 3000);
setTimeout(() => {
if (!displayAboutText) {
togglePropertyInState('displayAboutText');
}
}, 4000);
setTimeout(() => {
if (!displayEnterText) {
togglePropertyInState('displayEnterText');
}
}, 5000);
setTimeout(() => {
if (!displayWelcomeHeader) {
togglePropertyInState('displayWelcomeHeader');
}
}, 1000);

return (
<div className="landing-page-container">
<MediaQuery maxWidth={767}>
<MobileLandingPage
displayWelcomeHeader={displayWelcomeHeader}
/>
</MediaQuery>

<MediaQuery minWidth={768}>
<DesktopLandingPage
displayCommandText={displayCommandText}
displayInstallText={displayInstallText}
displayAboutText={displayAboutText}
displayEnterText={displayEnterText}
togglePopUpModal={togglePopUpModal}
/>
</MediaQuery>
</div>
);
};

最佳答案

setTimeout() 属于 componentDidMount 或 componentDidUpdate 方法。您还需要在 componentWillUnmount 方法中使用 clearTimeout 来取消超时,否则如果您在超时触发之前卸载组件,您将收到 setState on an unmounted component 警告。这是一个简化的示例。

class SomeComp extends Component {
constructor() {...}

_startAnimation = timeout => {
this.enterAnimation = setTimeout(
() => this.setState({ mode: 'entered' }),
timeout
)
}

componentDidMount() {
const timeout = someNum

this._startAnimation(timeout)
}

componentWillUnmount() {
!!this.enterAnimation && clearTimeout(this.enterAnimation)
}

render() {...}

}

关于javascript - 在 React 和 Redux 中使用 setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52121487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com