我正在尝试根据某些条件(包括给数组中特定对象的值)更新状态。我尝试了各种语法,这些错误给了我this.setState(this.state.destinations[i].map(destinations=>destinations.visibilityStatus=false))这样的错误,我知道我写的所有其他东西都在起作用,除了setState。在下面的代码中,您将找到相关的函数,该函数将使用其当前语法更新所有对象(而非特定对象)的visibleStatus状态。我该如何写setState以便从理论上说以这种方式更新状态this.setState (this.state.destinations.map(destinations=>destinations.visibilityStatus=false))或以另一种方式写入状态(仍然无效)this.state.destinations[i].visibilityStatus===false

这是该函数的当前代码,如果您需要更多详细信息,请务必告诉您,但通常,这已经足够了,因为它比语法和逻辑结构更重要。谢谢你的时间:

updateDestinationsVisibilityStatus=()=>{
      for(var i =0; i<this.state.destinations.length; i++){
          for( var n=0; n<this.state.destinations[i].visibilityTime.length; n++){
          if(this.state.destinations[i].visibilityTime[n].visibility===false && this.state.timerString===this.state.destinations[i].visibilityTime[n].value)
          {  this.setState (this.state.destinations.map(destinations=>destinations.visibilityStatus=false))}

          else if (this.state.destinations[i].visibilityTime[n].visibility===true && this.state.timerString===this.state.destinations[i].visibilityTime[n].value)
          {  this.setState (this.state.destinations.map(destinations=>destinations.visibilityStatus=true))}
          console.log(this.state.destinations[i].visibilityStatus)

      }
    }

  }

最佳答案

每个事件不要在一个属性上多次调用setState。
它是异步的,状态不会立即更改。根据经验,如果多次调用updater function,则应确保通过它。

这可以节省您的情况:

updateDestinationsVisibilityStatus = () => {
    let dest = this.state.destinations; // use local variable
    for (let i = 0; i < dest.length; i++) {
        for (let n = 0; n < dest[i].visibilityTime.length; n++) {
            if (dest[i].visibilityTime[n].visibility === false && this.state.timerString === dest[i].visibilityTime[n].value) {
                dest[i].visibilityStatus = false; // manipulate that local
            } else if (dest[i].visibilityTime[n].visibility === true && this.state.timerString === dest[i].visibilityTime[n].value) {
                dest[i].visibilityStatus = true;
            }
        }
    }

    this.setState({destinations: dest}); // write back to state
}

10-06 01:04