Reactjs setState异步设置函数中的props参数有什么意义

Reactjs setState异步设置函数中的props参数有什么意义,reactjs,Reactjs,在React中,由于setState方法的某些异步特性,当您希望基于状态的先前值更新状态时,您需要传入一个函数作为第一个参数,以便在实际更新状态时setState可以访问状态的最新版本。e、 g const setStateCallback = prevState => { return {myInteger: prevState.myInteger + this.props.step}; } this.setState(setStateCallback); 我的问题是,如果sta

在React中,由于
setState
方法的某些异步特性,当您希望基于状态的先前值更新状态时,您需要传入一个函数作为第一个参数,以便在实际更新状态时
setState
可以访问状态的最新版本。e、 g

const setStateCallback = prevState => {
  return {myInteger: prevState.myInteger + this.props.step};
}

this.setState(setStateCallback);
我的问题是,如果state是唯一可能过期的数据,那么函数中的
props
参数有什么意义。为什么不直接使用

const setStateCallback =  prevState => {
  return {myInteger: prevState.myInteger + this.props.step};
}

this.setState(setStateCallback);
我假设
setState
工作的方式是
setStateCallback
被存储,并且在
React
准备好处理所有
setState
调用后将被调用。在那个时候,是的,我需要访问过程中使用其他
setState
调用时发生的状态更新。但是,当调用
setStateCallback
时,同时对
this.props.step
所做的任何更新都将在
this.props.step
上可用,因为我引用的是
this.props
对象。如果我这样做了

const step = this.props.step

const setStateCallback =  prevState => {
  return {myInteger: prevState.myInteger + step};
}

this.setState(setStateCallback);
这是一个问题,因为
步骤
(假设这是一个数字或字符串)的值不再被props对象引用,并且可能已过期

因此,假设我的假设是正确的,那么访问回调
setStateCallback
props
参数似乎是不必要的

更新

正如Brad Bumbalough所指出的,下面是我自己的一点额外证据,
props
arg确实是必要的


这一发现意味着,在自定义类方法中访问
this.state
this.props
时,必须小心。例如对于在
setState
回调中调用的任何自定义类方法,您需要确保这些方法中的任何引用或由该调用生成的后续类方法中的任何引用都将
state
props
作为参数,并且不引用
this.props
this.state
I我认为他们的观点是,一切都是异步的。因此,如果您明确依赖于
props
来更改状态,则无法100%确定
this.props
setState
调用首次排队后没有更改

这将成为问题的可能生命周期可能是…

  • 初始渲染
  • 从服务器获取数据的异步调用
  • 用户交互触发一个取决于当前道具的
    setState
    调用(
    prevState.myInteger+props.step
    )。将立即使用当前状态/道具对其进行评估,并将结果存储为状态属性的新值
  • setState
    呼叫已排队
  • 异步调用返回并更新父组件/存储,触发道具进行更改
  • setState
    调用已被处理和应用,但用于生成存储状态数据的道具现在与用户可以看到的当前道具不同步,导致混乱、混乱和WW3。好吧,我可能夸大了
  • 关键是它可能会改变。99%的情况下,您可能不需要在通话中钻取这一特定信息。但是如果你需要的话,电话就在那里

    如果有人在看,下面是答案

    React可以将多个setState()调用批处理到一个更新中以提高性能

    由于this.props和this.state可能会异步更新,因此不应依赖它们的值来计算下一个状态

    要修复它,请使用第二种形式的setState(),它接受函数而不是对象。该函数将接收前一个状态作为第一个参数,应用更新时的props作为第二个参数


    我不确定我是否理解你对3的假设。我只是更新了问题,以便更清楚地说明我的假设。你觉得怎么样?谢谢!今晚晚些时候我检查了一下,并进行了相应的更新。好的,我花了一些时间阅读了这篇文章,答案似乎在
    updateComponent
    implementation中。似乎可以在调用所有
    setState
    回调后切换对
    this.props的引用。这意味着在
    setState
    回调中引用
    this.props
    不保证是最新的,并且
    props
    参数是您拥有最新道具的唯一保证。