@frilix
Иногда "творю"

React ES6 state?

Доброго времени суток. Не так давно я познакомился с React и использовал нотацию ES5, но решил перейти на ES6 и получаю ошибку: Uncaught TypeError: Cannot read property 'timeout' of undefined, хотя в конструкторе переменная есть:

import React from 'react';

class PomidoroTimer extends React.Component {
  constructor(props) {
     super(props);
     this.intervals = [];
     this.state = {
         timeout: 25 * 60
     };
  }

  componentWillMount() {
    this.setInterval(this.decrimentTimer, 1000);
  }

  setInterval() {
    this.intervals.push(setInterval.apply(null, arguments));
  }

  decrimentTimer() {
    this.setState({timeout: this.state.timeout - 1});
  }

  componentWillUnmount() {
    this.intervals.map(clearInterval);
  }

  updateTimeout(timeout) {
    this.setState({ timeout: timeout });
  }

  render() {
    return (
      <div className="timer">
        <div className="timer-block">
          <div className="timer__digit-block">
            <div className="digits">58</div>
            <div className="timer__digit-block-text">Минут</div>
          </div>
          <div className="timer__separator"></div>
          <div className="timer__digit-block">
            <div className="digits">44</div>
            <div className="timer__digit-block-text">Секунд</div>
          </div>
        </div>
      </div>
    );
  }
}

export default PomidoroTimer;
  • Вопрос задан
  • 521 просмотр
Решения вопроса 3
@frilix Автор вопроса
Иногда "творю"
Решилось все через bind:
constructor(props) {
     super(props);
     this.intervals = [];
     this.state = {
         timeout: 25 * 60
     };

     // Bind Methids
     this.decrimentTimer = this.decrimentTimer.bind(this);
  }
Ответ написан
Комментировать
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
componentWillMount() {
    this.setInterval(() => this.decrimentTimer(), 1000);
  }
Ответ написан
Комментировать
SPAHI4
@SPAHI4
реактовцы - это не девы, а прокидыватели пропсов
Вопрос решен, но все же подскажу 2 варианта

1. сахар для bind
componentWillMount() {
    this.setInterval(::this.decrimentTimer, 1000);
  }

2. arrow function
decrimentTimer = () => this.setState({timeout: this.state.timeout - 1});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@YNile
JS Developer
Очевидно надо было ещё задержаться на es5, чтобы подтянуть базовые вещи типа контекста :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы