Reactjs 为什么需要传递接受先前状态的回调?

Reactjs 为什么需要传递接受先前状态的回调?,reactjs,Reactjs,抱歉,我只是问这个问题,因为我刚刚看到Node.js的创始人在某处说,“试着让自己理解这个系统。” 如果没有通过接受前一状态的回调,为什么React经常出错 设置状态时,组件将很快重新加载,但不会同步。这使react可以批量处理多个更改并一次应用所有更改,以便在同一调用堆栈中多次设置状态时只需要一个渲染 因此,如果您像这样背靠背地编写两行代码: class ClassCounterTwo extends Component { constructor(props) { super(p

抱歉,我只是问这个问题,因为我刚刚看到Node.js的创始人在某处说,“试着让自己理解这个系统。”

如果没有通过接受前一状态的回调,为什么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将调用该函数,并确保传入最新的值,使您能够正确计算下一个状态,无论您更新它多少次

如果没有通过接受前一状态的回调,为什么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当然,钩子确实有状态(减去组件生命周期的开销)。