【发布时间】:2021-03-03 09:30:28
【问题描述】:
我正在尝试在我的网络作品集中为我的动画使用滚动位置。由于这个投资组合使用 nextJS,我不能依赖 window 对象,而且我使用的是导航宽滑块,所以我实际上不是在窗口中滚动,而是在一个名为 Page 的布局组件中滚动。
import React, { useEffect } from 'react';
import './page.css';
const Page = ({ children }) => {
useEffect(() => {
const scrollX = document.getElementsByClassName('page')
const scrollElement = scrollX[0];
console.log(scrollX.length)
console.log(scrollX)
scrollElement.addEventListener("scroll", function () {
console.log(scrollX[0].scrollTop)
});
return () => {
scrollElement.removeEventListener("scroll", () => { console.log('listener removed') })
}
}, [])
return <div className="page">{children}</div>;
};
export default Page;
这是一个生产版本:https://next-portfolio-kwn0390ih.vercel.app/
加载时,DOM 中只有一个 Page 组件。
行为如下:
- 在第一次挂载页面时添加第一个监听器,在导航时,还会在 DOM 中添加监听器以及新的页面组件。
- 只要您在两个页面之间导航,就不会添加新的侦听器/页面
- 如果导航到第三个页面,则在卸载旧页面时删除监听器,并在装载第三个页面时添加第三个页面的新监听器(等等...)
问题是:当您从第一个导航到第二个时,一切看起来都很好,但是如果您返回第一页,您会注意到控制台正在记录第二个侦听器的 scrollX 值,而不是第一个侦听器。每次进入第二页时,它似乎都会向同一个 scrollElement 添加另一个侦听器,即使它不是同一个 Page 组件。
我该怎么做?我猜这两个组件正在尝试访问相同的 scrollElement :/
感谢您的宝贵时间。
【问题讨论】:
标签: reactjs react-hooks next.js use-effect