Я понимаю, что учебники и документация React недвусмысленно предупреждают, что состояние не должно быть напрямую изменено и что все должно проходить через setState
.
Я хотел бы понять, почему я не могу просто напрямую изменить состояние, а затем (в той же функции) вызвать this.setState({})
просто для запуска render
.
Например, приведенный ниже код работает нормально:
const React = require('react');
const App = React.createClass({
getInitialState: function() {
return {
some: {
rather: {
deeply: {
embedded: {
stuff: 1
}}}}};
},
updateCounter: function () {
this.state.some.rather.deeply.embedded.stuff++;
this.setState({}); // just to trigger the render ...
},
render: function() {
return (
<div>
Counter value: {this.state.some.rather.deeply.embedded.stuff}
<br></br>
<button onClick={this.updateCounter}>inc</button>
</div>
);
}
});
export default App;
Я все за следующие соглашения, но я хотел бы улучшить мое дальнейшее понимание того, как на самом деле работает ReactJS и что может пойти не так или это неоптимально с приведенным выше кодом.
Примечания под документацией this.setState
основном идентифицируют две ошибки:
- Что если вы изменяете состояние напрямую, а затем вызываете
this.setState
это может заменить (перезаписать?) Выполненную вами мутацию. Я не вижу, как это может произойти в приведенном выше коде. - Этот
setState
может эффективно мутироватьthis.state
в асинхронном/отложенном режиме, поэтому при доступе кthis.state
сразу после вызоваthis.setState
вам не гарантирован доступ к окончательному мутированному состоянию. Я понимаю, что это не проблема, еслиthis.setState
является последним вызовом функции обновления.