使用 NextJS 获取滚动位置

Get scroll position with NextJS

我想知道用户是否滚动或不更新 NextJS 中的 UI。我有以下代码,我找到的所有示例都有相同的代码:

  const [scrollY, setScrollY] = useState(0);

  const onScroll = (event) => {
    const { pageYOffset, scrollY } = window;
    console.log("yOffset", pageYOffset, "scrollY", scrollY);
    setScrollY(window.pageYOffset);
  };

  useEffect(() => {
    document.body.addEventListener("scroll", onScroll, { passive: true });
    // remove event on unmount to prevent a memory leak
    () => document.removeEventListener("scroll", onScroll, { passive: true });
  }, []);

但是滚动条没有更新,documentwindow 都没有更新。我总是得到相同的输出:

有什么建议吗? 谢谢:)

onScroll 函数在每次重新渲染时销毁并在状态发生变化时再次创建,因此其对象 ID 也会发生变化。 并且在 useEffect 上定义的不应更改。

您需要使用 useCallback 来防止此行为并将 onScroll 包装在其中。

并将 addEventListener 添加到 window,因为您正在阅读 pageYOffset,scrollY 来自 window onScroll 函数

  const onScroll = useCallback(event => {
      const { pageYOffset, scrollY } = window;
      console.log("yOffset", pageYOffset, "scrollY", scrollY);
      setScrollY(window.pageYOffset);
  }, []);

  useEffect(() => {
    //add eventlistener to window
    window.addEventListener("scroll", onScroll, { passive: true });
    // remove event on unmount to prevent a memory leak with the cleanup
    return {
       window.removeEventListener("scroll", onScroll, { passive: true });
    }
  }, []);