Czy React ponownie renderuje wszystkie komponenty i komponenty podrzędne przy każdym setStatewywołaniu?
Jeśli tak, to dlaczego? Pomyślałem, że pomysł polegał na tym, że React renderował tak mało, jak to konieczne - gdy stan się zmienia.
W poniższym prostym przykładzie obie klasy są renderowane ponownie po kliknięciu tekstu, pomimo faktu, że stan nie zmienia się przy kolejnych kliknięciach, ponieważ program obsługi onClick zawsze ustawia statetę samą wartość:
this.setState({'test':'me'});
Spodziewałbym się, że renderowanie nastąpi tylko w przypadku zmiany statedanych.
Oto kod przykładu, jako skrzypce JS i osadzony fragment:
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()nawet z fałszywymi danymi powoduje, że element renderuje się inaczej, więc powiedziałbym „tak”. Absolutnie powinien spróbować ponownie renderować obiekt, gdy coś mogło się zmienić, ponieważ w przeciwnym razie demo - zakładając, że było to zamierzone zachowanie - nie działałoby!
shouldComponentUpdatemetody, która, jak zakładam , musi być zawarta w React. Wygląda na to, że domyślna wersja zawarta w React po prostu zwraca true- co zmusza komponent do ponownego renderowania za każdym razem.