代码之家  ›  专栏  ›  技术社区  ›  Moaaz Bhnas

设置状态挂钩不更新

  •  0
  • Moaaz Bhnas  · 技术社区  · 5 年前

    我有一个标题,我想在向下滚动时隐藏,在向上滚动时显示。
    为此,我将滚动位置保存为 prevScrollPos 处于将其与当前滚动位置进行比较的状态 onscroll ,然后更新 prevScrollPos 到目前为止:

     const [visible, setVisible] = React.useState(true);
     const [prevScrollPos, setPrevScrollPos] = React.useState(window.pageYOffset);
    
      const handleScroll = () => {
        const scrollPos = window.pageYOffset;
        const visible = scrollPos < prevScrollPos;
    
        setVisible(visible);
        setPrevScrollPos(scrollPos);
      }
    

    问题是,出于某种原因 PrevScrollPos 不会更新。
    笔: https://codepen.io/moaaz_bs/pen/jgGRoj?editors=0110

    1 回复  |  直到 5 年前
        1
  •  3
  •   grenzbotin    5 年前

    您需要修改useEffect函数:

      React.useEffect(() => {
        window.addEventListener('scroll', handleScroll);
        return () => {
          window.removeEventListener('scroll', handleScroll);
        };
      });
    

    基本上你没有访问权限 prevScrollPos 因此,PrevPos处理器中的PrevPos将始终返回0。要解决这个问题,依赖项数组不应该存在。

    ->+添加事件侦听器后,不要忘记将其删除。:-)

        2
  •  0
  •   Merci Dieu KIMPOLO    5 年前

    你能试试这个吗:

     const [visible, setVisible] = React.useState(true);
     const [prevScrollPos, setPrevScrollPos] = React.useState(window.pageYOffset);
    
      const handleScroll = () => {
        const scrollPos = window.pageYOffset;
        const visible_new = scrollPos < prevScrollPos;
    
        setVisible(visible_new);
        setPrevScrollPos(scrollPos);
      }