【发布时间】:2019-05-07 21:09:05
【问题描述】:
第一次切换到 react hooks 并使用它们。我的状态似乎总是被设置回我传递它的初始值(0)。代码是让页面自动向下和向上滚动。该页面只是用于显示各种文件类型的练习。发生的情况是 scrollDir 变量将切换为设置为 1 或 -1 和 0。因此控制台将显示 1,0,1,0,1,0,1,0 等...我如何获得状态在更新期间停留?
function App(props) {
const [scrollDir, setScrollDir] = useState(0);
function scrollDown() {
if(document.documentElement.scrollTop < 10)
{
setScrollDir(1);
}
else if(document.documentElement.scrollTop >= document.documentElement.scrollHeight - window.innerHeight)
{
setScrollDir(-1);
}
window.scrollBy(0, scrollDir);
}
useEffect(() => {
setInterval(scrollDown, 100);
});
return (
<StackGrid monitorImagesLoaded={true} columnWidth={"33.33%"} >
<img src={posterPNG} />
<img src={posterJPG} />
<img src={posterGIF} />
<video src={posterMP4} loop autoPlay muted />
<Document file={posterPDF}>
<Page pageNumber={1} />
</Document>
</StackGrid>
);
}
【问题讨论】:
-
使用带有钩子的
setInterval不是很直观。请参阅此处的示例:stackoverflow.com/a/53990887/3984987。如需更深入的解释,您可以阅读此overreacted.io/making-setinterval-declarative-with-react-hooks -
钩子清理返回函数中需要clearInterval
-
@DonovanM 很好,我使用了您所附的参考资料来解决这个问题。有趣的东西!我喜欢这个答案,因为它也向我介绍了自定义钩子。如果您输入它作为答案,我会接受。
-
@GrantKochmann 是的,自定义挂钩非常有用!谢谢,我添加了我之前的评论作为答案。
标签: javascript reactjs react-hooks react-state