Reactjs 为什么需要传递接受先前状态的回调?
抱歉,我只是问这个问题,因为我刚刚看到Node.js的创始人在某处说,“试着让自己理解这个系统。” 如果没有通过接受前一状态的回调,为什么React经常出错 设置状态时,组件将很快重新加载,但不会同步。这使react可以批量处理多个更改并一次应用所有更改,以便在同一调用堆栈中多次设置状态时只需要一个渲染 因此,如果您像这样背靠背地编写两行代码:Reactjs 为什么需要传递接受先前状态的回调?,reactjs,Reactjs,抱歉,我只是问这个问题,因为我刚刚看到Node.js的创始人在某处说,“试着让自己理解这个系统。” 如果没有通过接受前一状态的回调,为什么React经常出错 设置状态时,组件将很快重新加载,但不会同步。这使react可以批量处理多个更改并一次应用所有更改,以便在同一调用堆栈中多次设置状态时只需要一个渲染 因此,如果您像这样背靠背地编写两行代码: class ClassCounterTwo extends Component { constructor(props) { super(p
class ClassCounterTwo extends Component {
constructor(props) {
super(props)
this.state = {
count: 0
}
}
incrementCount = () => {
this.setState(prevState => {
return {
count: prevState.count + 1
}
})
}
render() {
return (
<div>
<button onClick={this.incrementCount}>Count {this.state.count}</button>
</div>
)
}
this.setState(prevState => {
return {
count: prevState.count + 1
}
它将只渲染一次,以2作为新状态
如果您编写代码检查this.state
,并假设this.state
是最新的,则会出现问题。例如:
this.setState({ count: 1 });
this.setState({ count: 2 });
如果此代码开始时计数为0,则我将告诉react将计数设置为1,然后再告诉react将其设置为1,因为此.state.count在这两行之间没有更改。React只渲染一次,但因为我已经告诉过它两次了,所以这就是我们在屏幕上留下的内容
在大多数情况下,这些行不会在代码中背靠背出现;它们可能在组件不同部分的不同事件侦听器上执行,但在任何情况下,核心点都是this.state.count
只告诉您代码执行时的计数,而不是我们即将渲染时的计数
因此,如果您需要将新状态建立在旧状态的基础上,那么就有setState的函数版本。React将调用该函数,并确保传入最新的值,使您能够正确计算下一个状态,无论您更新它多少次
如果没有通过接受前一状态的回调,为什么React经常出错
设置状态时,组件将很快重新加载,但不会同步。这使react可以批量处理多个更改并一次应用所有更改,以便在同一调用堆栈中多次设置状态时只需要一个渲染
因此,如果您像这样背靠背地编写两行代码:
class ClassCounterTwo extends Component {
constructor(props) {
super(props)
this.state = {
count: 0
}
}
incrementCount = () => {
this.setState(prevState => {
return {
count: prevState.count + 1
}
})
}
render() {
return (
<div>
<button onClick={this.incrementCount}>Count {this.state.count}</button>
</div>
)
}
this.setState(prevState => {
return {
count: prevState.count + 1
}
它将只渲染一次,以2作为新状态
如果您编写代码检查this.state
,并假设this.state
是最新的,则会出现问题。例如:
this.setState({ count: 1 });
this.setState({ count: 2 });
如果此代码开始时计数为0,则我将告诉react将计数设置为1,然后再告诉react将其设置为1,因为此.state.count在这两行之间没有更改。React只渲染一次,但因为我已经告诉过它两次了,所以这就是我们在屏幕上留下的内容
在大多数情况下,这些行不会在代码中背靠背出现;它们可能在组件不同部分的不同事件侦听器上执行,但在任何情况下,核心点都是this.state.count
只告诉您代码执行时的计数,而不是我们即将渲染时的计数
因此,如果您需要将新状态建立在旧状态的基础上,那么就有setState的函数版本。React将调用该函数,并确保传入最新的值,这样无论更新多少次,都可以正确计算下一个状态。我的建议是使用挂钩而不是组件,这样就不必担心状态。在这里阅读更多@zee这是一个奇怪的评论。钩子不能让你避免担心状态,它们让你首先做状态(在函数组件中),useState钩子有一个回调版本,它会提示与Ridwan问的问题相同的问题。@NicholasTower当然,钩子确实有状态(减去组件生命周期的开销).我的建议是用钩子代替组件,这样你就不用担心状态了。在这里阅读更多@zee这是一个奇怪的评论。钩子不能让你避免担心状态,它们让你首先做状态(在函数组件中),useState钩子有一个回调版本,它会提示与Ridwan问的问题相同的问题。@NicholasTower当然,钩子确实有状态(减去组件生命周期的开销)。