Синтаксический вопрос относительно обновления состояния с помощью setState в цикле for - PullRequest
2 голосов
/ 01 декабря 2019

Я пытаюсь обновить состояние на основе определенных условий, которые включают значения, данные конкретным объектам в массиве. Я пробовал различный синтаксис, который дал мне ошибку, такую ​​как this.setState(this.state.destinations[i].map(destinations=>destinations.visibilityStatus=false)) Я знаю, что все остальное, что я написал, работает, кроме setState. В приведенном ниже коде вы найдете соответствующую функцию, которая с помощью своего текущего синтаксиса обновляет visibilityStatus всех объектов, а не конкретного объекта. как я могу написать 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)

      }
    }

  }

1 Ответ

3 голосов
/ 01 декабря 2019

Никогда не вызывайте setState для одного свойства более одного раза за событие. Это асинхронно, и состояние не изменяется немедленно. Как правило, вы должны обязательно передавать функцию обновления , если вы вызываете ее более одного раза.

Это сохранение в вашем случае:

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
}
...