我通常在做出反应时更新状态以在反应中切换图标显示:
toggle = () => {
this.setState({
open: !this.state.open
}) // setState
} // toggle callback
现在我看到了一种新方法,建议采用以上方式:
toggle = () => {
this.setState((prevState, props) => {
return {
open: !prevState.open
} // return
}) // setState
} // toggle callback
在这种情况下,setState函数使用一个更新程序(在这种情况下是一个回调函数),它起作用。 setState函数如何使用更新程序?更新程序props
中的第二个参数甚至没有使用,它的用途是什么?
答案 0 :(得分:1)
在您的情况下,您可以省略setState的第二个参数,
startCounter = 8;
balls = new ArrayList<>();
int goodBalls=0;
while (goodBalls<amount){
diameter = random.nextInt(30) + 10 + diameterRange;//generate diameter value for ball
startCounter += diameter + 25;//stop balls from spawning on top of eachother
BouncingBall ball = makeBall(startCounter, diameter, i);
if !(Physics.Collision(ball, balls)||ball.getXPosition()>850||ball.getYPosition()>550){//avoid starting collisions
balls.add(ball);
goodBalls++;
}
}
但是,当您想要根据toggle = () => {
this.setState((prevState) => {
return {
open: !prevState.open
}
})
}
和current props
值更新状态时,它非常有用。
另外
prevState
不是回调,而是更新程序功能。根据React文档:
第一个参数是带有签名的更新程序函数:
(prevState) => { return { open: !prevState.open } }
(prevState, props) => stateChange
是对先前状态的引用。它不应该 直接变异。相反,应该通过构建a来表示更改 基于prevState
的输入的新对象。对于 例如,假设我们想要增加state中的值prevState and prop
props.step:
更新程序功能收到的
this.setState((prevState, props) => { return {counter: prevState.counter + props.step}; });
和道具都是 保证是最新的。更新程序的输出很浅 与prevState
合并。
另请参阅Stackoverflow上的这个答案,看看setState回调对什么有用,
答案 1 :(得分:0)
我想添加更多信息,为什么建议在setState
中使用回调函数。
setState是异步的
React批量状态更改以提高性能,以便state
之后setState
可能不会立即更改。这意味着您在调用state
时不应该依赖当前setState
,因为您无法确定该状态是什么!
此外,您的语法可能只是
this.setState(prevState => ({ open: !prevState.open }))