Estou lendo a seção Formulários dereactjsdocumentação e apenas tentei esse código para demonstrar o onChange
uso ( JSBIN ).
var React= require('react');
var ControlledForm= React.createClass({
getInitialState: function() {
return {
value: "initial value"
};
},
handleChange: function(event) {
console.log(this.state.value);
this.setState({value: event.target.value});
console.log(this.state.value);
},
render: function() {
return (
<input type="text" value={this.state.value} onChange={this.handleChange}/>
);
}
});
React.render(
<ControlledForm/>,
document.getElementById('mount')
);
Quando atualizo o <input/>
valor no navegador, o segundo console.log
dentro do handleChange
retorno de chamada é impresso da mesma value
forma que o primeiro console.log
: Por que não consigo ver o resultado this.setState({value: event.target.value})
no escopo do handleChange
retorno de chamada?
javascript
reactjs
react-jsx
tarrsalah
fonte
fonte
Respostas:
Da documentação do React :
Se você deseja que uma função seja executada após a alteração do estado, passe-a como um retorno de chamada.
fonte
componentDidUpdate
. Será chamado depois que o estado for alterado.shouldComponentUpdate
que especifique o contrário. O que exatamente você está tentando fazer no retorno de chamada parasetState
o qual deseja ocorrer antes da nova renderização?Conforme mencionado na documentação do React, não há garantia de
setState
ser acionado de forma síncrona; portanto, vocêconsole.log
pode retornar o estado antes da atualização.Michael Parker menciona passar um retorno de chamada dentro do
setState
. Outra maneira de lidar com a lógica após a mudança de estado é através docomponentDidUpdate
método do ciclo de vida, que é o método recomendado nos documentos do React.Isso é particularmente útil quando pode haver
setState
disparos sucessivos e você deseja disparar a mesma função após cada alteração de estado. Em vez de adicionar um retorno de chamada a cada umsetState
, você pode colocar a função dentro docomponentDidUpdate
, com lógica específica dentro, se necessário.fonte
Você pode tentar usar o ES7 assíncrono / aguardar. Por exemplo, usando o seu exemplo:
fonte
setState
é assíncrono, mas não retorna nada ; portantoawait
, funciona na maioria das vezes, mas apenas por acaso, pois é uma condição de corrida.Cuidado com os métodos do ciclo de vida de reação!
Eu trabalhei por várias horas para descobrir que
getDerivedStateFromProps
será chamado depois de cada vezsetState()
.😂
fonte
async-await
sintaxe funciona perfeitamente para algo como o seguinte ...fonte
Leia sobre o Event Loop para ter uma ideia clara da natureza assíncrona em JS e por que demora para atualizar -
Conseqüentemente -
pois leva tempo para atualizar. Para alcançar o processo acima -
fonte