Я понимаю, что учебники и документация 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является последним вызовом функции обновления.
