Estoy leyendo la sección de formularios dereaccionardocumentación y acabo de probar este código para demostrar el onChangeuso ( 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')
);
Cuando actualizo el <input/>valor en el navegador, el segundo console.logdentro de la handleChangedevolución de llamada se imprime igual valueque el primero console.log. ¿Por qué no puedo ver el resultado this.setState({value: event.target.value})en el alcance de la handleChangedevolución de llamada?
javascript
reactjs
react-jsx
tarrsalah
fuente
fuente

Respuestas:
De la documentación de React :
Si desea que se ejecute una función después de que ocurra el cambio de estado, páselo como devolución de llamada.
fuente
componentDidUpdate. Se llamará después de que el estado haya cambiado.shouldComponentUpdateque especifique lo contrario. ¿Qué es exactamente lo que está tratando de hacer en la devolución de llamada que está pasandosetStateque desea que ocurra antes de volver a renderizar?Como se menciona en la documentación de React, no hay garantía de
setStateser despedido sincrónicamente, por lo queconsole.logpuede devolver el estado antes de la actualización.Michael Parker menciona pasar una devolución de llamada dentro del
setState. Otra forma de manejar la lógica después del cambio de estado es a través delcomponentDidUpdatemétodo del ciclo de vida, que es el método recomendado en React docs.Esto es particularmente útil cuando puede haber sucesivos
setStatedisparos, y le gustaría activar la misma función después de cada cambio de estado. En lugar de agregar una devolución de llamada a cada unosetState, puede colocar la función dentro delcomponentDidUpdate, con lógica específica dentro si es necesario.fuente
Puede intentar usar ES7 async / await. Por ejemplo, usando su ejemplo:
fuente
setStatees asíncrono pero no devuelve nada , porawaitlo que funcionará la mayor parte del tiempo, pero solo por casualidad, ya que es una condición de carrera.Cuidado con los métodos de reacción del ciclo de vida!
Trabajé durante varias horas para descubrir que
getDerivedStateFromPropsse llamará después de cadasetState().😂
fuente
async-awaitla sintaxis funciona perfectamente para algo como lo siguiente ...fuente
Lea acerca de Event Loop para tener una idea clara de la naturaleza asincrónica en JS y por qué toma tiempo actualizarse.
Por lo tanto
ya que lleva tiempo actualizarlo. Para lograr el proceso anterior:
fuente