javascript - 在 useEffect 挂钩中从窗口中删除滚动事件侦听器时遇到一些问题
问题描述
我正在尝试锁定然后有条件地解锁窗口滚动useEffect
。似乎当我去删除滚动事件侦听器时,它与要删除的引用函数不匹配scrollEvent
。
任何帮助表示赞赏。
export const Viewer = () => {
const [view, setView] = useCustom()
const enterView = Object.entries(view).length > 0
const [animation, set, stop] = useSpring(() => ({
slide: [100],
opacity: [0],
}))
const scrollEvent = offsetY => () => {
window.scrollTo({
top: offsetY,
behavior: "smooth",
})
}
useEffect(() => {
const offsetY = window.pageYOffset
if (enterView) {
set({ slide: [0], opacity: [1] })
window.addEventListener("scroll", scrollEvent(offsetY), true)
stop()
} else {
window.removeEventListener("scroll", scrollEvent(offsetY), true)
set({ slide: [100], opacity: [0] })
}
}, [enterView])
return (
<ViewerComponent
setView={setView}
isActive={enterView}
inAnimation={animation}
data={view}
/>
)
}
解决方案
原因scrollEvent
是每次渲染都会重新创建,因此它们的引用将不匹配。最简单的方法是将scrollEvent
定义移到组件之外,因此它不是生命周期的一部分:
const scrollEvent = offsetY => () => {
window.scrollTo({
top: offsetY,
behavior: "smooth",
})
}
export const Viewer = () => {
// ...
推荐阅读
- java - 如何检查请求的 URL 是否是 servlet(在过滤器中)?
- python - 如何使用python在csv文件中查找相同值的列
- ruby-on-rails - Bootstrap4 Datetimepicker 在 Rails 5.2.1 中不起作用
- python - 格式字符串中可能遇到单个“}”
- elasticsearch - 获取 ES 中的所有翻转索引
- php - 我可以在 Angular 中使用 Post 请求而不是 Delete 吗?
- docker - Ubuntu 16.04安装docker-ce时子进程/usr/bin/dpkg返回错误码(1)
- c - sed 匹配组并在重用之前修改组
- python - 如何使用逻辑运算符
- shared-libraries - 为什么会忽略运行路径?