我正在尝试创建一个在显示主要内容之前淡出的问候UI。可以找到所需的效果HERE
当达到某个滚动输入时,例如从顶部输出100px
我用setTimeout实现了这个效果,但我现在想知道如何正确设置clearTimeout。
这是我的代码
componentDidMount() {
window.addEventListener(
"wheel",
() => requestAnimationFrame(this.handleScroll.bind(this)),
false
);
}
handleScroll(e){
const scrolltop = window.scrollY;
scrolltop > 120 ? this.showGreeting().bind(this):null
}
showGreeting(){
this.setState({
greetingDisplay:true,
})
const timer = setTimeout(this.showContent.bind(this),5000);
}
showContent(){
this.setState({
greetingDisplay:false,
contentDisplay:1,
})
//How do I clear the timer here?
}
答案 0 :(得分:6)
在showGreeting
中,您设置超时并将其存储在local const
varibale中。将其绑定到组件实例,即this
。
constructor(){
this.timer = null;
//............rest
}
showGreeting(){
this.setState({
greetingDisplay:true,
})
this.timer=setTimeout(this.showContent.bind(this),3000);
^^^^^^^^^^^
}
当调用showContent
状态时,状态会更新,这会触发render
,然后触发componentDidUpdate
生命周期。
在componentDidUpdate
中,使用this.timer
清除超时。
componentDidUpdate{
clearTimeout(this.timer);
}
答案 1 :(得分:1)
您可以轻松使用ES6箭头功能,而不会产生以下副作用:
showContent = () => {
this.setState({
greetingDisplay:false,
contentDisplay:1,
});
}
showGreeting = () => {
this.setState({
greetingDisplay:true,
});
setTimeout( () => this.showContent, 3000 );
}