ReactJS - store.getState() undefined

Я получаю данные из внешнего API, используя реализацию Flux altjs. Вызов API работает от действия, возвращается обратно в хранилище, а затем в моем компоненте запускается функция onChange(). Я пытаюсь установить состояние из текущего состояния магазина:

import React, { Component, PropTypes } from 'react';
import AppStore from '../../stores/AppStore';
import AppActions from '../../actions/AppActions';

const title = 'Contact Us';


class ContactPage extends Component {

    constructor(props) {
        super(props);
        this.state = AppStore.getState();
    }

  static contextTypes = {
    onSetTitle: PropTypes.func.isRequired,
  };

  componentWillMount() {
    AppActions.getData();
    this.context.onSetTitle(title);
    AppStore.listen(this.onChange)
}

componentWillUnmount() {
    AppStore.unlisten(this.onChange)
}

onChange() {
    this.state = AppStore.getState();
}

  render() {
    return (
      <div className={s.root}>
        <div className={s.container}>
          <h1>{title}</h1>
          <span>{this.state.data.id}</span>
        </div>
      </div>
    );
}

}

export default ContactPage;

Я получаю сообщение об ошибке "Невозможно установить свойство 'состояние' из неопределенного"

Мой магазин выглядит так:

import alt from '../alt';
import AppActions from '../actions/AppActions';

class AppStore {
    constructor() {
        this.bindActions(AppActions);
        this.loading = false;
        this.data = {};
        this.error = null
    }

    onGetDataSuccess(data) {
        this.data = data;
    }
}

export default alt.createStore(AppStore, 'AppStore');

this.state = AppStore.getState () не выдает никаких ошибок в конструкторе. Он просто добавляется в функцию onChange(). Как правильно я должен установить здесь состояние?

1 ответ

Решение

Когда вы используете классы ES6, вам нужно явно связать все обратные вызовы, так как нет автосвязывания. Это может сбивать с толку, так как при использовании React.createClass, response автоматически свяжет все обратные вызовы в компонент, и поэтому вы можете просто передать this.onChange в качестве обратного вызова.

Например.

componentWillMount() {
  ...
  AppStore.listen(this.onChange.bind(this));
}
Другие вопросы по тегам