Задать вопрос
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting

Как правильно изменить state?

Написал первый компонент на React, но столкнулся с проблемой: после рендера, по клику значение state.prop увеличивается без проблем, но увеличить значение state.prop до рендера не получается.
Как правильно увеличить значение state.prop до рендера?

class App extends React.Component {

    constructor() {
        super();
        this.state = {prop: 1}
    }

    state_change() {
        this.setState({prop: ++this.state.prop});
    }

    render() {

        this.state_change.bind(this); // prop не был увеличен

        return <div>
            <p>{this.state.prop}</p>
            <input type="button" value="Обновить" onClick={this.state_change.bind(this)}/>
        </div>;
    }

}

ReactDOM.render(<App/>, document.getElementById('body'));
  • Вопрос задан
  • 2368 просмотров
Подписаться 1 Простой 4 комментария
Решения вопроса 2
miraage
@miraage
Старый прогер
incProp = () => {
  this.setState(state => ({
    prop: state.prop + 1,
  }));
};

render() {
  return <button onClick={this.incProp}>...</button>;
}
Ответ написан
Комментировать
profesor08
@profesor08
В рендер функции нельзя менять стейт. Это аксиома, надо запомнить.

P.S. Можешь обойтись без биндингов.
class App extends React.Component {

    constructor() {
        super();
        this.state = {
          prop: 1,
        }
    }

    stateChange = () => {
        this.setState({
          prop: this.state.prop + 1,
        });
    }

    render = () => {
        return <div>
            <p>{this.state.prop}</p>
            <input type="button" value="Обновить" onClick={() => {this.stateChange()}}/>
        </div>;
    }

}

ReactDOM.render(<App/>, document.getElementById('body'));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы