O React renderiza novamente todos os componentes e subcomponentes sempre que setState
é chamado?
Se sim, por quê? Eu pensei que a idéia era que o React renderizasse apenas o necessário - quando o estado mudou.
No exemplo simples a seguir, as duas classes são renderizadas novamente quando o texto é clicado, apesar do estado não ser alterado nos cliques subsequentes, pois o manipulador onClick sempre define state
o mesmo valor:
this.setState({'test':'me'});
Eu esperava que as renderizações só acontecessem se os state
dados tivessem mudado.
Aqui está o código do exemplo, como um JS Fiddle , e um snippet incorporado:
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()
mesmo com dados fictícios faz com que o elemento seja renderizado de maneira diferente, então eu diria que sim. Absolutamente, ele deve tentar renderizar novamente seu objeto quando algo puder ter mudado, porque, caso contrário, sua demonstração - assumindo que era o comportamento pretendido - não funcionaria!
shouldComponentUpdate
método, que eu assumi que uma versão simples dele já deve estar incluída no próprio React. Parece que a versão padrão incluída no react simplesmente retorna true
- o que força o componente a renderizar novamente a cada vez.