Então, eu tenho isso:
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 é apenas uma matriz de números, [1, 5, 9]
por exemplo this.state.dealersOverallTotal
, não fornece o total correto, mas total
fornece? Até coloquei um tempo limite para ver se isso resolveu o problema. algum óbvio ou devo postar mais código?
javascript
reactjs
state
setstate
O verme
fonte
fonte
setState
.setState
é realmente executado após registrar o estado. Acho que o que você pretendia fazer na depuração era colocar aconsole.log
parte dentro do tempo limite esetState
fora dela.Respostas:
setState()
geralmente é assíncrono, o que significa que no momento em que vocêconsole.log
o estado, ele ainda não está atualizado. Tente colocar o log no retorno de chamada dosetState()
método. É executado após a conclusão da mudança de estado:this.setState({ dealersOverallTotal: total }, () => { console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); });
fonte
setState
.this.setState({someVar: newValue},function(){ console.log("force update") });
setState é assíncrono. Você pode usar o método de retorno de chamada para obter o estado atualizado.
changeHandler(event) { this.setState({ yourName: event.target.value }, () => console.log(this.state.yourName)); }
fonte
Usando async / await
async changeHandler(event) { await this.setState({ yourName: event.target.value }); console.log(this.state.yourName); }
fonte
A
setState()
operação é assíncrona e, portanto, vocêconsole.log()
será executado antes desetState()
alterar os valores e, portanto, você verá o resultado.Para resolver isso, registre o valor na função de retorno de chamada de
setState()
, como:setTimeout(() => { this.setState({dealersOverallTotal: total}, function(){ console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); }); }, 10)
fonte
No caso de ganchos, você deve usar
useEffect
gancho.const [fruit, setFruit] = useState(''); setFruit('Apple'); useEffect(() => { console.log('Fruit', fruit); }, [fruit])
fonte
useEffect
é executado em cada re-renderização, e se os itens passados na matriz são variáveis de estado e mudados. Portanto, quando a fruta for alterada e o componente for renderizado novamente, esse useEffect será executado.O setstate é assíncrono na reação, portanto, para ver o estado atualizado no console, use o retorno de chamada conforme mostrado abaixo (a função de retorno de chamada será executada após a atualização do setstate)
O método abaixo "não é recomendado", mas para compreensão, se você alterar o estado diretamente, poderá ver o estado atualizado na próxima linha. Repito que isso é "não recomendado"
fonte
apenas adicione o
componentDidUpdate(){}
método em seu código e ele funcionará. você pode verificar o ciclo de vida do nativo de reação aqui:https://images.app.goo.gl/BVRAi4ea2P4LchqJ8
fonte
Eu tive a mesma situação com alguns códigos complicados e nada das sugestões existentes funcionou para mim.
Meu problema era que
setState
estava acontecendo a partir da função callback, emitida por um dos componentes. E minha suspeita é que a chamada estava ocorrendo de forma síncrona, o que impediasetState
de configurar o estado de forma alguma.Simplificando, eu tenho algo assim:
render() { <Control ref={_ => this.control = _} onChange={this.handleChange} onUpdated={this.handleUpdate} /> } handleChange() { this.control.doUpdate(); } handleUpdate() { this.setState({...}); }
A maneira que eu tinha de "correção" que era para colocar
doUpdate()
emsetTimeout
como este:handleChange() { setTimeout(() => { this.control.doUpdate(); }, 10); }
Não é o ideal, mas de outra forma seria uma refatoração significativa.
fonte
Tive um problema ao definir o estado de reação várias vezes (sempre usava o estado padrão). Seguir este problema de reação / github funcionou para mim
const [state, setState] = useState({ foo: "abc", bar: 123 }); // Do this! setState(prevState => { return { ...prevState, foo: "def" }; }); setState(prevState => { return { ...prevState, bar: 456 }; });
fonte