React Router ждет разрешения

9

Я пришел из Angular и использовал для решения ui-router возможности, которые позволяют легко ждать и вводить результаты в контроллеры.

В настоящее время я хочу подражать этому, отреагировав без необходимости писать запрос (или триггерные действия) в методе componentWillMount при использовании React Router. Я думаю, что есть лучший способ сделать это, я просто не понял, что.

Хотелось бы получить совет или указать мне, где я могу научиться это делать

Теги:

1 ответ

10
Лучший ответ

Лучше всего использовать обратный вызов в Router.run (http://rackt.github.io/react-router/#Router.run). Обратный вызов, который вы передаете, вызывается при каждом изменении URL-адреса и отвечает за повторный рендеринг, как этот пример, взятый со страницы:

Router.run(routes, function (Root) {
  // whenever the url changes, this callback is called again
  React.render(<Root/>, document.body);
});

В этой функции вы можете выполнить любые операции async, необходимые для вызова React.render(), например:

Router.run(routes, function (Root) {
  // whenever the url changes, this callback is called again
  asyncStuff().then(function (data) {
    React.render(<Root data={data} />, document.body);
  });
});

Проблема с этим подходом заключается в том, что ваш пользовательский интерфейс не будет реагировать вообще до тех пор, пока эти данные не будут доступны. Вместо этого я бы рекомендовал рендеринг вашего компонента с пустым состоянием и выборку данных в componentDidMount, а затем повторную визуализацию, когда поступают данные. Или, что еще лучше, отделите извлечение данных и рендеринг на два компонента. Один компонент извлекает данные и передает их компоненту рендеринга в качестве свойства. Компонент для извлечения данных может даже избежать отображения другого компонента, если данные отсутствуют, например:

render: function () {
  if (this.state.data) {
    return <TheComponent data={this.state.data} />;
  } else {
    return <Spinner />;
  }
}

Это общий шаблон в React, чтобы отделить компоненты, связанные с извлечением и состоянием данных, и компоненты, которые отображают это состояние. Вы хотите нажимать компоненты состояния как можно дальше по иерархии, потому что они создают логическую границу. Компоненты с состоянием составляют 90% ошибок, и приятно иметь возможность сосредоточиться на них, когда вы охотитесь за ошибками.

Еще одна проблема с ожиданием заключается в том, что пользователь может быстро перемещаться, а это значит, что обратный вызов Router.run снова вызван до того, как будут введены первые данные. Таким образом, вам нужно убедиться, что вы прервите последнюю операцию, а не визуализируете ее вообще.

  • 0
    Я фактически закончил тем, что написал решение, которое имитирует модель разрешения ui-router. Я поделюсь как ответ в ближайшее время
  • 2
    @MohamedElMahallawy Я бы на самом деле был бы заинтересован в этом ответе, который вы обещали "поделиться в ближайшее время" ... :-)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню