【发布时间】:2020-07-06 07:58:01
【问题描述】:
我做了一个 React 组件,它可以在必要时将内容滚动到页面顶部,如果你看一下代码沙箱示例,如果向下滚动一点会显示“GO Top”按钮,如果单击它,页面将滚动到顶部,如果您尝试向下滚动,它总是会将您带到页面顶部。原因是没有清除计时器,因为 intervalId 始终为空。具体来说,如果您查看第 20 行,intervalId 始终为空,我想这可能与关闭有关,但我无法修复它。请帮忙。
谢谢!
代码贴在下面,codesanbox example is here
import React from "react";
const GoTop = ({ scrollStepInPx, delayInMs }) => {
const [intervalId, setIntervalId] = React.useState(null);
const [position, setPosition] = React.useState(false);
React.useEffect(() => {
document.addEventListener("scroll", () => {
if (window.scrollY > 200) {
setPosition(true);
} else {
setPosition(false);
}
});
window.scrollTo(0, 0);
}, []);
const onScrollStep = () => {
if (window.pageYOffset === 0) {
console.log(intervalId); //always null
clearInterval(intervalId);
return;
}
window.scroll(0, window.pageYOffset - scrollStepInPx);
};
const scrollToTop = () => {
const id = setInterval(onScrollStep, delayInMs);
setIntervalId(() => id);
};
const renderGoTopIcon = () => {
if (position) {
return (
<button className="go-top" onClick={scrollToTop} type="button">
Go Top
</button>
);
}
return null;
};
return <>{renderGoTopIcon()}</>;
};
export default GoTop;
【问题讨论】:
标签: reactjs react-hooks setinterval