Javascript useState是同步的吗?

Javascript useState是同步的吗?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,在过去,我们被明确警告调用setState({myProperty})是异步的,并且this.state.myProperty的值在回调或下一个render()方法之前无效 使用useState,显式更新状态后如何获取状态值? 钩子是如何工作的?据我所知,useState的setter函数不接受回调,例如 const [value, setValue] = useState(0); setValue(42, () => console.log('hi callback'); 不会导致运行

在过去,我们被明确警告调用
setState({myProperty})
是异步的,并且
this.state.myProperty
的值在回调或下一个
render()
方法之前无效

使用useState,显式更新状态后如何获取状态值?

钩子是如何工作的?据我所知,
useState
的setter函数不接受回调,例如

const [value, setValue] = useState(0);
setValue(42, () => console.log('hi callback');
不会导致运行回调


在旧世界中,我的另一个解决方法是在类上挂起一个实例变量
(例如this.otherProperty=42)
,但这在这里不起作用,因为没有可重用的函数实例(在严格模式下没有
this

const [state, setState] = useState(initialState);
返回一个有状态值,以及一个更新该值的函数

在初始呈现期间,返回的状态(state)与作为第一个参数(initialState)传递的值相同

setState函数用于更新状态。它接受一个新的状态值并使组件的重新呈现排队

在后续重新呈现期间,useState返回的第一个值将始终是应用更新后的最新状态

因此,您的新状态,无论是什么,都是您刚刚在
useState
中设置的,即
initialState
的值。它直接进入
状态
,然后进行反应性更新。进一步引用相关文件:

调用useState做什么?它声明了一个“状态变量”。我们的变量叫做count,但我们可以把它叫做其他任何东西,比如banana。这是一种在函数调用之间“保留”某些值的方法-useState是一种使用This.state在类中提供的完全相同功能的新方法。通常,当函数退出时,变量“消失”,但React保留状态变量

如果希望在状态更新时执行某些操作,则只需使用
componentdiddupdate

即可在更新后访问最新状态。如果您有多个状态挂钩,并且只想跟踪其中一部分的更新,则可以将状态作为
useffect
函数的第二个参数在数组中传递:

useEffect(() => { console.log(state1, state2)}, [state1])
仅当更新了
state1
时,才会调用上述
useffect
,您不应该信任此函数中的
state2
值,因为它可能不是最新的值


如果您想知道由
useState
创建的更新函数是否是同步的,即如果在使用钩子时更新状态,请提供一些见解。

使用钩子(
useffect
)和传递当前状态变量的可能性-使用钩子的用例是什么“更新完状态后告诉我“?可以将useState与回调函数一起使用。默认情况下不提供此功能,但此自定义挂钩有帮助:
useState
的setter函数确实会按此处所述进行回调:此问题是在此功能可用之前发布的还是其他什么如果OP已经在使用挂钩,正如另一位回答者所指出的那样,他最好使用
useffect
。如果React Hooks在2月6日发布了16.8,那么Claire Lin在1月10日如何引用Hooks?2月6日,Hooks以稳定的版本发布,虽然很多人几个月前就开始在生产中使用它们了。但这对我的情况没有帮助-状态1可以由多个事件更改,我无法分辨是哪个事件触发了状态更改。请注意,如果您在您的状态中使用对象或数组,则需要在
useffect
的第二个数组参数中设置它,例如
useffect(()=>…,[state.prop])
我需要在onPress函数中执行此操作。但是,useEffect只能在函数组件的主体中调用。还有别的解决办法吗?
useEffect(() => { console.log(state1, state2)}, [state1])