2017-01-03 9 views
4

Так что у меня это:Реагировать SetState не обновляет состояние

let total = newDealersDeckTotal.reduce(function(a, b) { 
    return a + b; 
}, 
0); 

console.log(total, 'tittal'); //outputs correct total 
setTimeout(() => { 
    this.setState({dealersOverallTotal: total}); 
}, 10); 

console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); //outputs incorrect total 

newDealersDeckTotal просто массив чисел [1, 5, 9] например однако this.state.dealersOverallTotal не дает правильного общего количества, но total делает? Я даже поставил задержку таймаута, чтобы понять, разрешило ли это проблему. любой очевидный или я должен опубликовать больше кода?

+1

http://stackoverflow.com/a/36087156/4453045 – Assan

+0

@Assan cheers !! –

+0

Кроме того, что сказано в ответах, вы явно регистрируете значение состояния, * до * вы вызываете 'setState'. –

ответ

15

setState() обычно асинхронный, что означает, что в то время, когда вы console.log состояние, оно еще не обновлено. Попробуйте поместить журнал в обратный вызов метода setState(). Он выполняется после того, как изменение состояния завершения:

this.setState({ dealersOverallTotal: total },() => { 
    console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); 
}); 
+0

В дополнение к этому, OP явно регистрирует значение состояния * до *, которое они вызывают 'setState'. –

+0

Это работает и для меня, в прошлом я использовал это: 'this.setState ({someVar: newValue}, function() {console.log (" force update}); 'но по какой-то причине это не было если я обновил код, как описано выше, он работает. Любая идея, почему? – Jozcar

+0

@Jozcar Должен также работать, синтаксис был неправильным (отсутствующие круглые скобки): 'this.setState ({someVar: newValue}, function() {console.log ("force update")}); ' –

0

setState() занимает много времени, чтобы мутировать значение, и вы браузер asynchronous и, следовательно, ваш console.log() будет выполняться до того, как setState мутирует значения и, следовательно, вы видите результат.

Для того, чтобы решить эту проблему, необходимо войти значение в callback function of setState как

setTimeout(() => {this.setState({dealersOverallTotal: total}, function(){ 
       console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); 
     }); 
     }, 10)