Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 为什么此.state中的数组上的concat不工作?_Reactjs - Fatal编程技术网

Reactjs 为什么此.state中的数组上的concat不工作?

Reactjs 为什么此.state中的数组上的concat不工作?,reactjs,Reactjs,我试图在位于组件状态的数组中的键日期下添加渲染日期,但它始终返回0 constructor(props) { super(props); this.state = { dates: [] } } componentWillMount() { this.renderDateComp() } renderDateComp() { for(var i = 0; i < 5; i++) { var dat = ne

我试图在位于组件状态的数组中的键日期下添加渲染日期,但它始终返回0

constructor(props) {
    super(props);
    this.state = {
      dates: []
    }
  }

  componentWillMount() {
    this.renderDateComp()
  }

  renderDateComp() {
    for(var i = 0; i < 5; i++) {
      var dat = new Date(Date().valueOf());
      dat.setDate(dat.getDate() + i);
      this.setState({ dates: this.state.dates.concat(dat) });
      console.log(this.state.dates); //prints length of 0
    }
  }

首先,状态转换不是即时的,在大多数情况下是异步的。想象一下,每次设置状态时,它都会将状态更改添加到一个更改队列中,并且React会持续处理该队列,执行所有这些状态更改。因此,如果更改状态,那么在下一行代码中立即打印状态,状态可能不会更改,因为console.log发生在状态更改添加到列表之后,但在更改实际通过该队列之前


其次,最好在for循环之后设置状态,因此只需设置一次,而不是5次。

首先,状态转换不是即时的,在大多数情况下是异步的。想象一下,每次设置状态时,它都会将状态更改添加到一个更改队列中,并且React会持续处理该队列,执行所有这些状态更改。因此,如果更改状态,那么在下一行代码中立即打印状态,状态可能不会更改,因为console.log发生在状态更改添加到列表之后,但在更改实际通过该队列之前


其次,在for循环之后设置状态可能更好,因此只需设置一次,而不是5次。

值得阅读setState的文档

它将对更改进行排队,但如果您想以某种方式使用新值,则会有一个回调版本

this.setState((prevState, props) => {
  return {myInteger: prevState.myInteger + props.step};
});

值得阅读setState的文档

它将对更改进行排队,但如果您想以某种方式使用新值,则会有一个回调版本

this.setState((prevState, props) => {
  return {myInteger: prevState.myInteger + props.step};
});

更具体地说,如果您这样做:

this.setState({ dates: this.state.dates.concat(dat) }, () => console.log(this.state.dates));

您将得到预期的结果。

更具体地说,如果您这样做:

this.setState({ dates: this.state.dates.concat(dat) }, () => console.log(this.state.dates));

您将获得预期的结果。

建议的方法是:

在获得最终日期数组后,仅调用setState一次。 将this.state.dates记录在setState的回调中。只有在React正确更新this.state之后,才会调用它。 这里需要注意的关键点是setState是异步的。您可能不需要在实际代码中对数组进行console.log

阅读更多关于setState的信息


建议的方法是:

在获得最终日期数组后,仅调用setState一次。 将this.state.dates记录在setState的回调中。只有在React正确更新this.state之后,才会调用它。 这里需要注意的关键点是setState是异步的。您可能不需要在实际代码中对数组进行console.log

阅读更多关于setState的信息