我试图根据个人是否在组件上向下滚动来控制React组件的可见性。可见性作为"in“属性传递给Fade元素。
我已经使用添加了侦听器onMount的UseEffect钩子设置了一个侦听器。实际的onScroll函数应该更新scrollTop状态(这是页面顶部高度的当前值),然后更新滚动状态(它将事件滚动到页面顶部的滚动与前一个状态进行比较,如果第一个状态大于第二个状态,则返回true)。
但是,由于某些原因,setScrollTop钩子不工作,滚动状态继续保持为0。
我做错了什么?下面是完整的组件:
export const Header = (props) => {
const classes = useStyles();
const [scrolling, setScrolling] = useState(false);
const [scrollTop, setScrollTop] = useState(0);
const onScroll = (e) => {
setScrollTop(e.target.documentElement.scrollTop);
setScrolling(e.target.documentElement.scrollTop > scrollTop);
}
useEffect(() => {
window.addEventListener('scroll', onScroll);
},[]);
useEffect(() => {
console.log(scrollTop);
}, [scrollTop])
return (
<Fade in={!scrolling}>
<AppBar className={classes.header} position="fixed">
....发布于 2019-08-12 04:03:29
您的钩子中缺少依赖项。试试这个:
useEffect(() => {
const onScroll = e => {
setScrollTop(e.target.documentElement.scrollTop);
setScrolling(e.target.documentElement.scrollTop > scrollTop);
};
window.addEventListener("scroll", onScroll);
return () => window.removeEventListener("scroll", onScroll);
}, [scrollTop]);通过在useEffect中移动onScroll,您不需要在钩子的依赖项上跟踪它,但是,由于它使用组件作用域中的scrollTop,因此您需要添加它。
或者,如果由于某种原因不想在useEffect中移动onScroll定义,则需要将onScroll包装在useCallback中,并在useEffect的依赖项数组中跟踪它。
通常,我建议在ESlint规则中添加react-hooks/exhaustive-deps
此外,在cleanup函数中删除事件侦听器也是一个好主意。
发布于 2020-06-06 22:58:04
或者,您可以使用window.pageYOffset。这样对我来说更容易理解:
const [scrolling, setScrolling] = useState(false);
const [scrollTop, setScrollTop] = useState(0);
useEffect(() => {
function onScroll() {
let currentPosition = window.pageYOffset; // or use document.documentElement.scrollTop;
if (currentPosition > scrollTop) {
// downscroll code
setScrolling(false);
} else {
// upscroll code
setScrolling(true);
}
setScrollTop(currentPosition <= 0 ? 0 : currentPosition);
}
window.addEventListener("scroll", onScroll);
return () => window.removeEventListener("scroll", onScroll);
}, [scrollTop]);https://stackoverflow.com/questions/57453141
复制相似问题