javascript - useEffect 中的 Scroll 功能反应非常奇怪
问题描述
我有包含聊天消息的 div,我希望它在渲染后立即向下滚动到最新消息。因此,当我在 useEffect 中对该 div 使用滚动功能时,它不起作用,但是当我在 setTimeout 中运行它时,它起作用了
useEffect(()=>{
getConversation()//fetch the conversation
setTimeout(() => {
holder.current.scroll(0, holder.current.scrollHeight)
console.log('=====================>',holder.current.scrollHeight)
}, 400);
},[getConversation])
如果我将时间设置为 200 毫秒而不是 400 毫秒,那真的很奇怪
解决方案
抓取和滚动应该分开。
首次加载组件时会发生提取。
滚动应该在内容加载时发生,并且页面尚未滚动到顶部,因此滚动应该仅取决于这两个标准,例如:
useEffect(()=>{
getConversation() // <--- updates state 'conversations'
},[ getConversation ]);
useEffect(()=>{
if( needsToScroll ){ // <-- check somehow if already top
holder.current.scroll(...)
}
}, [ conversation ]);
该needsToScroll
条件可能会被省略,然后页面会尝试在 的每次更改时滚动conversation
,这可能不可见,不经常并且可以。
另一方面,[ conversation ]
如果您需要检查是否holder.current
可用(在每次渲染上),则可能需要忽略整个依赖项 ( )。然后needsToScroll
可以同时检查holder.current
和conversation
。
推荐阅读
- javascript - React:如何将按钮的值从 map() 函数链接到 API 请求 URI
- swift - 无法从字段 XCUITest 中删除文本
- python - Keras BERT - 高精度,验证 acc,f1,auc -> 但预测很差
- python - 如何使使用过的一对一关系对象消失在 django admin 中
- postgresql - PostgreSQL 12.2 - 自动提交问题。创建一个表空间
- javascript - 将自己的组件添加到 Modal Antd 设计中
- r - exp(-x^2) 从 -Infinity 到 +Infinity 的 Monte Carlo 积分
- mysql - 我的 SQL 脚本没问题,但我无法在 Laravel 6 中编写此 SQL 脚本
- java - CSV 编写器也错误地写入文件名
- parsing - 编译器设计中的内联汇编