Я пришел из Angular и использовал для решения ui-router возможности, которые позволяют легко ждать и вводить результаты в контроллеры.
В настоящее время я хочу подражать этому, отреагировав без необходимости писать запрос (или триггерные действия) в методе componentWillMount
при использовании React Router. Я думаю, что есть лучший способ сделать это, я просто не понял, что.
Хотелось бы получить совет или указать мне, где я могу научиться это делать
Лучше всего использовать обратный вызов в 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
снова вызван до того, как будут введены первые данные. Таким образом, вам нужно убедиться, что вы прервите последнюю операцию, а не визуализируете ее вообще.