Estoy leyendo la sección de formularios dereaccionardocumentación y acabo de probar este código para demostrar el 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')
);
Cuando actualizo el <input/>
valor en el navegador, el segundo console.log
dentro de la handleChange
devolución de llamada se imprime igual value
que el primero console.log
. ¿Por qué no puedo ver el resultado this.setState({value: event.target.value})
en el alcance de la handleChange
devolució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.shouldComponentUpdate
que especifique lo contrario. ¿Qué es exactamente lo que está tratando de hacer en la devolución de llamada que está pasandosetState
que desea que ocurra antes de volver a renderizar?Como se menciona en la documentación de React, no hay garantía de
setState
ser despedido sincrónicamente, por lo queconsole.log
puede 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 delcomponentDidUpdate
método del ciclo de vida, que es el método recomendado en React docs.Esto es particularmente útil cuando puede haber sucesivos
setState
disparos, 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
setState
es asíncrono pero no devuelve nada , porawait
lo 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
getDerivedStateFromProps
se llamará después de cadasetState()
.😂
fuente
async-await
la 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