javascript - 添加带有 useEffect 钩子(Hook)的事件监听器以进行滚动

标签 javascript reactjs react-hooks event-listener

我正在使用下面的 useEffect Hook 来感知页面滚动,但它没有将“yes”记录到控制台。我缺少什么?我的页面滚动超过 50 像素,因此应该打印出“yes”。

useEffect(() => {

        const scrollFun = window.addEventListener("scroll", () => {
            if(window.pageYOffset%50 === 0) {
                console.log("yes");
            }
        });

        return () => {
            window.removeEventListener("scroll", scrollFun);
        };        

    }, []);

最佳答案

目前还不清楚您是否只想要一个“页面已滚动 50 像素”,或者您是否正在寻找每 50 像素滚动一次的持续监控,因此我将尝试回答这两个问题,您可以选择更接近的一个。

场景 1 - 滚动前 50 像素并记录

这个是微不足道的。我建议使用 React ref 来“捕获”已滚动页面至少 50px 的内容,并在向后滚动时重置。

const scrolled50Ref = useRef();

useEffect(() => {
  const scrollFun = () => {
    if (window.pageYOffset > 50) {
      if (!scrolled50Ref.current) {
        scrolled50Ref.current = true;
        console.log('scrolled 50 px');
      }
    } else {
      scrolled50Ref.current = false;
    }
  }
  
  window.addEventListener("scroll", scrollFun);

  return () => {
    window.removeEventListener("scroll", scrollFun);
  };
}, []);

场景 2 - 每滚动 50 像素记录一次

这并不像您所看到的那样微不足道。这里的问题是,许多浏览器都使用加速滚动,因此您不会触及每个 pageYOffset 值。换句话说,滚动到一定速度/速率后,您可能不会达到可被 50 整除的 pageYOffset

这里的“修复”是增加可被 50 整除的“窗口”。

useEffect(() => {
  const scrollFun = () => {
    if (window.pageYOffset % 50 >= 45) {
      console.log("scrolled 50-ish pixels");
    }
  }
  
  window.addEventListener("scroll", scrollFun);

  return () => {
    window.removeEventListener("scroll", scrollFun);
  };
}, []);

演示

Edit adding-an-event-listener-with-useeffect-hook-for-scrolling (forked)

关于javascript - 添加带有 useEffect 钩子(Hook)的事件监听器以进行滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67395265/

相关文章:

javascript - React - useMemo 有一个复杂的表达式 - 将其提取到一个单独的变量中,以便对其进行静态检查

javascript - React useState 与 webpack-dev-server 一起使用时未定义

javascript - 我如何使用 Cypress 在特定的 HTML <select> 字段中选择 <option>?

javascript - 如何从二维数组中删除子数组?

javascript - 无法在 React.js 中设置蜂鸣声

javascript - 虚拟 DOM 到底存储在哪里?

reactjs - 从深度嵌套的组件更新状态而不重新渲染父组件

javascript - 带有 Eclipse WTP 的 JQuery、Java Servlet 示例

javascript - 将 React 组件数组传递给 useState 返回空数组

reactjs - 如何风格化 material-ui select