¿Reacciona React todos los componentes y subcomponentes cada vez que setState
se llama?
Si es así, ¿por qué? Pensé que la idea era que React solo representaba tan poco como fuera necesario, cuando el estado cambiaba.
En el siguiente ejemplo simple, ambas clases se renderizan nuevamente cuando se hace clic en el texto, a pesar de que el estado no cambia en los clics posteriores, ya que el controlador onClick siempre establece state
el mismo valor:
this.setState({'test':'me'});
Hubiera esperado que los renders solo ocurrieran si los state
datos hubieran cambiado.
Aquí está el código del ejemplo, como un JS Fiddle y un fragmento incrustado:
var TimeInChild = React.createClass({
render: function() {
var t = new Date().getTime();
return (
<p>Time in child:{t}</p>
);
}
});
var Main = React.createClass({
onTest: function() {
this.setState({'test':'me'});
},
render: function() {
var currentTime = new Date().getTime();
return (
<div onClick={this.onTest}>
<p>Time in main:{currentTime}</p>
<p>Click me to update time</p>
<TimeInChild/>
</div>
);
}
});
ReactDOM.render(<Main/>, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react-dom.min.js"></script>
[1]: http://jsfiddle.net/fp2tncmb/2/
setState()
incluso con datos ficticios hace que el elemento se represente de manera diferente, por lo que diría que sí. ¡Absolutamente debería intentar volver a renderizar su objeto cuando algo podría haber cambiado porque de lo contrario su demostración, suponiendo que fuera el comportamiento previsto, no funcionaría!
shouldComponentUpdate
método, que supuse que una versión simple de él ya debe estar incluida en React. Parece que la versión predeterminada incluida en react simplemente devuelve true
, lo que obliga al componente a volver a renderizarse cada vez.