Когда компоненты ReactJS делают вызовы AJAX для обновления состояния из реквизита?

У меня есть компонент React, который отображает информацию об объекте. Идентификатор объекта передается через свойство. Компонент запускает вызов AJAX в "componentDidMount" для извлечения сущности и состояния обновления, когда вызов завершается/завершается с ошибкой.

Это прекрасно работает, за исключением того, что компонент не извлекает новые данные при изменении идентификатора объекта (через реквизит).

Я попытался запустить вызов в "componentWillReceiveProps", но на этом этапе у компонента все еще есть старые свойства. Я должен был бы передать nextProps методу вызова AJAX, и это не кажется правильным.

Каков наилучший/самый чистый способ, чтобы компонент асинхронно обновлял свое состояние в ответ на изменение свойства?

Ответы

Ответ 1

Я тоже новичок, поэтому архитектура Flux немного запугивает меня. Я делаю это точно так, как вы сказали, используя componentWillMount для загрузки исходных данных через AJAX, а затем componentWillReceiveProps с помощью nextProps для загрузки новых данных снова, если/при изменении реквизита:

var Table = React.createClass({
  getInitialState: function() {
    return { data: [] };
  },

  componentWillMount: function(){
    this.dataSource();
  },

  componentWillReceiveProps: function(nextProps){
    this.dataSource(nextProps);
  },

  dataSource: function(props){
    props = props || this.props;

    return $.ajax({
      type: "get",
      dataType: 'json',
      url: '/products?page=' + props.page + "&pageSize=" + props.pageSize
    }).done(function(result){
      this.setState({ data: result });
    }.bind(this));
  },

  render: function() {
    return (
      <table className="table table-striped table-bordered">
        <Head />
        <Body data={this.state.data}/>
      </table>
    );
  }
});

Ответ 2

Вы правы, вызов в componentWillReceiveProps не лучший способ справиться с этим.

Я бы предложил попробовать архитектуру Flux, чтобы ваши данные могли быть "централизованы" в магазине. Когда идентификатор объекта изменяется, запустите действие, которое извлекает данные и обновляет хранилище новыми данными. Когда хранилище будет обновлено, оно выдает событие, а компоненты будут отображать новые данные.