reactjs - 使用 scrollTo 反应 ref 会触发滚动事件,即使我们在之后添加它并删除它
问题描述
我有一个带溢出的 div 和一个滚动容器。在切换此容器中的内容时,我想将它滚动到顶部(新的内容加载它),并且我想添加一个事件侦听器,它只在滚动到顶部之后才在滚动中执行操作。我虽然通过像 ref 和 useEffect 这样简单的东西来实现这一点:
useEffect(() => {
if (divRef && divRef.current) {
setCollapsed(false);
divRef.current.scrollTo(0, 0);
divRef.current.addEventListener("scroll", onScrollEvent);
}
return () => {
divRef.current!.removeEventListener("scroll", onScrollEvent);
};
}, [div, divRef]);
对 div 块中的onScrollEvent
图例做了一些额外的 css 样式,但只有在用户滚动时才应该是活动的,因此是监听器。
我遇到的问题是scrollTo(0,0)
触发器onScrollEvent
,它不应该。我已经尝试添加侦听器,因为您可以在scrollTo
& 删除它之后看到它。
onScrollEvent
只是启用状态更改的简单检查:
const onScrollEvent = () => {
if (!userControlled && !collapsed) setCollapsed(true);
};
发生在我身上的另一件奇怪的事情是,我最终只是使用了一个带有超时的解决方案来检查我们是否在 position 0 === divRef.current.scrollTo
,然后添加了事件。但不是我不能再删除该事件。从本质上讲,它总是在监听onScrollEvent
该事件中的状态变化userControlled
并没有检测到。
解决方案
推荐阅读
- php - 如何在 Laravel 7.x 中从控制器返回视图时传递 cookie?
- swift - 时间来错了,但日期很快就正确了
- javascript - 更改 NavLink 文本颜色 onClick
- azure - 与美国西部的服务总线通信时,英国南部的 Azure 功能超时
- java - 无法执行休眠查询语句?
- html - 之间的关系
和 HTML5 中的标签
- python - 为什么我只需要从模块导入子类而不从另一个实例导入它的基类和它的属性?
- api - 我们如何测试使用 azure 持久函数的 rest api 端点?
- html - 无法发布用 MD 文件写入的表格
- css - 我想用 sass 将图标悬停为白色(没有过滤器)