reactjs - 反应取消 clearTimeout 在 useEffect 上无法正常工作
问题描述
https://codepen.io/evan-jin/pen/qBjGWvR
const [hoverItem, setHoverItem] = useState(null)
const timerRef = useRef(null)
const addcursor = useCallback(() => {
console.log('addcursor')
clearTimeout(timerRef.current)
timerRef.current = null
timerRef.current = setTimeout(() => {
document.body.style.cursor = 'wait'
}, 10)
}, [])
const removeCursor = useCallback(() => {
if (timerRef.current === null) return
console.log('removeCursor')
timerRef.current = setTimeout(() => {
document.body.style.cursor = 'default'
}, 500)
}, [])
useEffect(() => {
if (hoverItem) {
addcursor()
} else {
removeCursor()
}
}, [hoverItem])
当我将鼠标悬停在框 div 上时,我想保持“等待光标”,但是当我停止移动光标时触发 setTimeout。
我尝试在 useEffect return(willUnmount) 上使用 clearTimeout 但不起作用。
如果我在每个盒子组件上进出它,但如果我将光标快速移动到另一个,它最终会触发 RemoveCursor setTimeout。
总结一下,
- 当我将光标移出时,我想将“等待光标”保持 500 毫秒
- 通过框后,如果光标在框上,“等待光标”需要留在框上,但不仅仅是消失
这个问题看起来很奇怪,但我只是为我的真实项目提出了这个简单的问题,请任何人帮助我..!
解决方案
我终于找到了问题!因为我在每个项目组件中声明了 timerRef。所以每个 timerRef 都引用了每个 Item 计时器。我可以通过在父组件中声明 timerRef 来简单地解决这个问题!我将把代码留在那个链接上。谢谢你们的努力。
推荐阅读
- angular - Angular 5 Lazy Loading Route Module with Children
- php - mpdf - 打印 php 字符串
- vba - Worksheet_SelectionChange 不适用于 XLSM 工作表
- mysql - 多索引慢查询
- java - 具有 CompletableFutures 且没有自定义 Executor 的代码是否仅使用等于内核数的线程数?
- java - 如何将看起来像数组的字符串转换为实际的对象数组?
- android - 没有 Google Cloud 的 ARCore 云锚(使用第 3 方代替持久对象)?
- reactjs - React - 当不同组件更改状态时更新组件
- assembly - 使用 FASM 在实模式下打印字符串
- sql - SQL Server:基于变量在 SELECT 语句中动态更改数据库名称