javascript - 使用 React Hooks 通过滚动更新
问题描述
我试图根据个人是否向下滚动组件来控制 React 组件的可见性。可见性作为“in”属性传递到Fade
元素中。
我已经使用 UseEffect Hook 设置了一个监听器,它在Mount 上添加了监听器。实际的 onScroll 函数应该更新 scrollTop 状态(即到页面顶部高度的当前值),然后是滚动状态(将事件滚动到页面顶部与之前的状态进行比较,并且如果第一个大于第二个,则返回 true)。
但是,由于某种原因 setScrollTop 挂钩不起作用,并且滚动状态继续保持在 0。
我究竟做错了什么?这是完整的组件:
export const Header = (props) => {
const classes = useStyles();
const [scrolling, setScrolling] = useState(false);
const [scrollTop, setScrollTop] = useState(0);
const onScroll = (e) => {
setScrollTop(e.target.documentElement.scrollTop);
setScrolling(e.target.documentElement.scrollTop > scrollTop);
}
useEffect(() => {
window.addEventListener('scroll', onScroll);
},[]);
useEffect(() => {
console.log(scrollTop);
}, [scrollTop])
return (
<Fade in={!scrolling}>
<AppBar className={classes.header} position="fixed">
....
解决方案
您缺少挂钩中的依赖项。尝试这个:
useEffect(() => {
const onScroll = e => {
setScrollTop(e.target.documentElement.scrollTop);
setScrolling(e.target.documentElement.scrollTop > scrollTop);
};
window.addEventListener("scroll", onScroll);
return () => window.removeEventListener("scroll", onScroll);
}, [scrollTop]);
通过在 .onScroll
中移动useEffect
,您不需要在钩子的依赖项上跟踪它,但是由于它是scrollTop
从组件的范围使用的,因此您需要添加它。
或者,如果由于某种原因您不想在 中移动onScroll
定义,则需要在的依赖数组中useEffect
包装并跟踪它。onScroll
useCallback
useEffect
一般来说,我建议添加react-hooks/exhaustive-deps
到您的 ESlint 规则中
在清理函数中删除事件侦听器也是一个好主意。
推荐阅读
- amazon-web-services - 在 AWS SES 中提醒电子邮件用户密码过期
- swift - 获取 iCloud 共享文件夹的 URL
- .htaccess - .htaccess 带有回退的多个重定向
- jquery-mobile - 如何修复 LightSwitch HTML 应用程序变得不可滚动(在移动设备上更频繁)
- windows - 如何使用源代码在 Windows 上构建 clang-llvm?
- list - 如何使用 Java 8 将 csv 转换为 List?
- database - 如何从测量 Influxdb 中删除该字段
- excel - 我正在尝试使用 VBA 查找包含特定文本的单元格
- java - 如何使不正确的切入点表达式引发异常?
- pyspark - 如何在第一行显示我现有的列名而不是 '_c0'、'_c1'、'_c2'、'_c3'、'_c4'?