【发布时间】:2020-10-27 13:32:45
【问题描述】:
我正在使用挂钩来更新状态。在我的代码中,我有一个 AppState 事件监听器,每当它触发时,我都会使用 setAppState 更新 appState,但是事件监听器中的 appState 并没有改变。但该值在侦听器之外更新。谁能解释为什么会这样?
这是我的代码:
import React, { FunctionComponent, useEffect, useState } from "react"
import { View, AppState, AppStateStatus } from "react-native"
const Test: FunctionComponent<any> = (props: any) => {
const [appState, setAppState] = useState < AppStateStatus > (AppState.currentState)
useEffect(() => {
AppState.addEventListener("change", _handleAppStateChange)
},[])
const _handleAppStateChange = (nextAppState: AppStateStatus) => {
//appState not Changing here
console.log(appState, "app state")
if (appState.match(/inactive|background/) && nextAppState === "active") {
console.log("App has come to the foreground!")
activateRealtime()
} else if (appState === "active" && nextAppState.match(/inactive|background/)) {
console.log("App has come to background!")
}
setAppState(nextAppState)
}
//appState updated here
console.log(appState, "app state")
return <View />
}
【问题讨论】:
-
你应该修复这个
const [appState, setAppState] = useState < AppStateStatus > AppState.currentState -
你怎么知道回调内部的状态没有更新?
setAppState(nextAppState)是函数中的最后一次调用。 -
这不是问题。改变了它。我只是忘了在那里加上括号。
-
@DrewReese。它更新。但在侦听器内部,值仍然相同。
-
@JaredSmith
State updates are asynchronous.尽管这是真的,但说这会导致人们尝试await setState。此外,在功能组件中使用 useState 创建的设置状态的主要问题是stale closures
标签: javascript reactjs react-native react-hooks