首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用React Hooks更新滚动

使用React Hooks更新滚动
EN

Stack Overflow用户
提问于 2019-08-12 03:53:34
回答 2查看 35.7K关注 0票数 22

我试图根据个人是否在组件上向下滚动来控制React组件的可见性。可见性作为"in“属性传递给Fade元素。

我已经使用添加了侦听器onMount的UseEffect钩子设置了一个侦听器。实际的onScroll函数应该更新scrollTop状态(这是页面顶部高度的当前值),然后更新滚动状态(它将事件滚动到页面顶部的滚动与前一个状态进行比较,如果第一个状态大于第二个状态,则返回true)。

但是,由于某些原因,setScrollTop钩子不工作,滚动状态继续保持为0。

我做错了什么?下面是完整的组件:

代码语言:javascript
复制
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">

  ....
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-12 04:03:29

您的钩子中缺少依赖项。试试这个:

代码语言:javascript
复制
  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函数中删除事件侦听器也是一个好主意。

票数 36
EN

Stack Overflow用户

发布于 2020-06-06 22:58:04

或者,您可以使用window.pageYOffset。这样对我来说更容易理解:

代码语言:javascript
复制
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]);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57453141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档