大佬教程收集整理的这篇文章主要介绍了为什么我不能从 useEffect 回调中更新我的组件的状态?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个计时器,该计时器在应用程序处于后台时启动,然后当应用程序再次被调用到前台时,应用程序会检查它是否已经 15 分钟(为了便于测试,我使用了 15 秒)现在)。如果它让应用将用户注销,否则计时器会重置。
如果这是一个骗局,请转介给我 - 我只是找不到任何东西。这几天我一直在努力解决这个问题。
这是我的想法:
这是我的问题:
注意事项:
const rootNavigator = () => {
const dispatch = usedispatch()
const [loginTimer,setLoginTimer] = useState(Date.Now())
useEffect(() => {
AppState.addEventListener('change',handleAppStateChange)
return (() => {
AppState.removeEventListener('change',handleAppStateChange)
})
},[])
const handleAppStateChange = (state) => {
if (state === "inactive" || state === "background") {
setLoginTimer(Date.Now())
}
if (state === "active") {
if (Date.Now() - loginTimer < 15000) {
setLoginTimer(Date.Now())
} else if (Date.Now() - loginTimer >= 15000) {
dispatch(logout())
}
}
}
return (
<SomeComponent />
...
)
}
我几乎可以肯定这是我遇到的一个非常基本的错误,因为我对如何处理的理解还不够完善。
提前致谢。
问题来自您对回调函数 useState
中的 handleAppStateChange()
数据的引用。 AppState.addEventListener
的回调在组件挂载时注册,但每次调用时都会为该回调使用当前状态的快照,因此,它不会以您希望的方式进行响应。>
好消息是,有多种方法可以解决此问题,this great answer here 中详细解释了其中一些方法。
,我的解决方案,使用来自 Jacob K 链接的信息。最后它非常简单,我把它归结为一个更简洁的陈述。可能可以使用三元,但这工作得很好。
const rootNavigator = () => {
const dispatch = useDispatch()
const timer = useRef(Date.now())
useEffect(() => {
AppState.addEventListener('change',handleAppStateChange)
return (() => {
AppState.removeEventListener('change',handleAppStateChange)
})
},[])
const handleAppStateChange = (state) => {
if (state === "inactive" || state === "background") {
timer.current = Date.now()
}
if (state === "active" && (Date.now() - timer.current > 15000)) {
dispatch(logout())
}
}
return (
<SomeComponent />
...
)
}
以上是大佬教程为你收集整理的为什么我不能从 useEffect 回调中更新我的组件的状态?全部内容,希望文章能够帮你解决为什么我不能从 useEffect 回调中更新我的组件的状态?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。