In the past, we've been explicitly warned that calling setState({myProperty})
is asynchronous, and the value of this.state.myProperty
is not valid until the callback, or until the next render()
method.
With useState, how do I get the value of the state after explicitly updating it?
How does this work with hooks? As far as I can tell, the setter function of useState
doesn't take a callback, e.g.
const [value, setValue] = useState(0);
setValue(42, () => console.log('hi callback');
doesn't result in the callback being run.
My other workaround in the old world is to hang an instance variable (e.g. this.otherProperty = 42)
on the class, but that doesn't work here, as there is no function instance to reuse (no this
in strict mode).
You can use useEffect
to access the latest state after updating it. If you have multiple state hooks and would like to track the update on only part of them, you can pass in the state in an array as the second argument of the useEffect
function:
useEffect(() => { console.log(state1, state2)}, [state1])
The above useEffect
will only be called when state1
is updated and you shouldn't trust the state2
value from inside this function as it may not be the latest.
If you are curious about whether the update function created by useState
is synchronous, i.e. if React batches the state update when using hooks, this answer provide some insight into it.