Day 9: Set state dynamically
If you want to set state dynamically, use a function.
this.setState(function(previousState) {
return { someProp: previousState.someProp + 1 }
})
We give setState an anonymous function to be called with state.
Our function takes that state and returns a new object with new values derived from the old.
Concise but not clear
This is how I write setState(fn) in a modern code base.
It’s how you’re likely to see it in the real world.
this.setState((previousState) =>
({ clapCount: previousState.clapCount + 1 })
)
Arrow functions have implicit returns but if the return type is an object, you must wrap it in parentheses.
Why previousState not currentState?
While setState does update state—eventually—it does so asynchronously and in batches.
Because of that implementation detail, the state that your function receives might not be the current state.
I’m so confused…
Yeah. It’s very confusing.
Tomorrow let’s implement our own state setter.
You’ll get a better idea of how setState sausage is made.
(I’ll use an actual sausage to illustrate)
Tinker with it
Use the workspace below and set some state with functions.
- Experiment with syntax. Use both function declarations and arrow function expressions to dynamically set state. Does one seem clearer than the other?
- For fun, use destructuring assignment to unpack values from the
stateobject.