You should do all your mutations inside the closure, and the computing outside of the closure.
It's doesn't explicitly say that anything about if it's different to call is in or outside the function. But it does recommend putting it inside. From my point of view, it's more clear and readable if you put the changes inside the setState function
Calling setState notifies the framework that the internal state of
this object has changed in a way that might impact the user interface
in this subtree, which causes the framework to schedule a build for
this State object.
You can see more at official Doc
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…