React рендерит все компоненты и подкомпоненты каждый раз, когда setState
вызывается?
Если так, то почему? Я думал, что идея была в том, что React рендерится так мало, как нужно - когда состояние меняется.
В следующем простом примере оба класса визуализируются снова при нажатии на текст, несмотря на тот факт, что состояние не изменяется при последующих щелчках, поскольку обработчик onClick всегда устанавливает state
одинаковое значение:
this.setState({'test':'me'});
Я бы ожидал, что рендеринг будет происходить только в случае изменения state
данных.
Вот код примера, как JS Fiddle и встроенный фрагмент:
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()
даже с фиктивными данными заставляет элемент отображаться по-другому, поэтому я бы сказал да. Абсолютно следует попытаться перерисовать ваш объект, когда что-то могло измениться, потому что в противном случае ваша демонстрация - при условии, что это было предполагаемое поведение - не сработала бы!
shouldComponentUpdate
метод, который, как я предполагал, должна быть уже включена в простую версию React. Похоже, версия по умолчанию, включенная в реагирование, просто возвращает, true
что заставляет компонент каждый раз перерисовываться.