Quería verificar qué sucede cuando usa this.setState varias veces (2 veces por el bien de la discusión). Pensé que el componente se procesará dos veces, pero aparentemente solo se procesará una vez. Otra expectativa que tenía era que tal vez la segunda llamada para setState se ejecutará sobre la primera, pero lo adivinó, funcionó bien.
Enlace a un JSfiddle
var Hello = React.createClass({
render: function() {
return (
<div>
<div>Hello {this.props.name}</div>
<CheckBox />
</div>
);
}
});
var CheckBox = React.createClass({
getInitialState: function() {
return {
alex: 0
};
},
handleChange: function(event) {
this.setState({
value: event.target.value
});
this.setState({
alex: 5
});
},
render: function() {
alert('render');
return (
<div>
<label htmlFor="alex">Alex</label>
<input type="checkbox" onChange={this.handleChange} name="alex" />
<div>{this.state.alex}</div>
</div>
);
}
});
ReactDOM.render(
<Hello name="World" />,
document.getElementById('container')
);
Como verá, una alerta que dice "render" aparece en cada render.
¿Tiene una explicación de por qué funcionó correctamente?
javascript
reactjs
alexunder
fuente
fuente
this.state.alex
, ¿qué sucede si agrega un elemento que también dependethis.state.value
?Respuestas:
Reaccionar lotes de actualizaciones de estado que ocurren en controladores de eventos y métodos de ciclo de vida. Por lo tanto, si actualiza el estado varias veces en un
<div onClick />
controlador, React esperará a que finalice el manejo de eventos antes de volver a renderizar.Para ser claros, esto solo funciona en manejadores de eventos sintéticos controlados por React y métodos de ciclo de vida. Las actualizaciones de estado no se almacenan por lotes en AJAX ni en los
setTimeout
controladores de eventos, por ejemplo.fuente
<div onClick />
) y los métodos del ciclo de vida de los componentes, sabe que puede cambiar de manera segura el comportamientosetState
durante la duración de la llamada a las actualizaciones de estado por lotes y esperar a que se vacíen. En AJAX osetTimeout
manejador, por el contrario, React no tiene forma de saber cuando nuestro manejador ha terminado de ejecutarse. Técnicamente, React pone en cola las actualizaciones de estado en ambos casos, pero se vacía inmediatamente fuera de un controlador controlado por React.ReactDOM.unstable_batchedUpdates(function)
para lotessetState
fuera de los controladores de eventos React. Como su nombre lo indica, anulará la garantía.El método setState () no actualiza inmediatamente el estado del componente, simplemente coloca la actualización en una cola para ser procesada más tarde. React puede agrupar varias solicitudes de actualización juntas para hacer que la renderización sea más eficiente. Debido a esto, se deben tomar precauciones especiales cuando intente actualizar el estado en función del estado anterior del componente.
Por ejemplo, el siguiente código solo incrementará el atributo de valor de estado en 1 aunque se haya llamado 4 veces:
Para usar un estado después de que se haya actualizado, realice toda la lógica en el argumento de devolución de llamada:
El método setState (actualizador, [devolución de llamada]) puede tomar una función de actualización como su primer argumento para actualizar el estado en función del estado y las propiedades anteriores. El valor de retorno de la función de actualización se fusionará superficialmente con el estado del componente anterior. El método actualiza el estado de forma asincrónica, por lo que hay una opción de devolución de llamada que se llamará una vez que el estado haya terminado de actualizarse por completo.
Ejemplo:
A continuación, se muestra un ejemplo de cómo actualizar el estado en función del estado anterior:
fuente
setState(updater,[callback])
, es como unObject.assign
agradecimiento menos detallado por eso!