React Router 等待解决
React Router wait for resolve
我来自 Angular,习惯了 ui-router 的解析功能,这使得等待和将结果注入控制器变得容易。
目前,我想在使用 React Router 时通过 React 来模拟这一点,而不必在 componentWillMount
方法中编写请求(或触发操作)。我觉得有更好的方法,只是还没想好。
很想得到一些建议或指出我可以在哪里学习这样做
最好的办法是使用 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);
});
在该函数中,您可以在调用 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);
});
});
这种方法的问题在于,在数据可用之前,您的 UI 根本不会做出反应。相反,我建议使用空状态渲染您的组件,并在 componentDidMount
中获取数据,然后在数据进入时重新渲染。或者更好的是,将数据获取和渲染分成两个组件。一个组件获取数据,并将其作为 属性 传递给呈现组件。除非数据存在,否则数据获取组件甚至可以避免渲染其他组件,例如:
render: function () {
if (this.state.data) {
return <TheComponent data={this.state.data} />;
} else {
return <Spinner />;
}
}
这是 React 中的一种常见模式,用于将处理数据获取和状态的组件与呈现该状态的组件分开。您希望将有状态组件尽可能向上推到层次结构中,因为它创建了一个逻辑边界。有状态的组件是 90% 的错误发生的地方,当你在寻找错误时能够专注于这些是很好的。
等待的另一个问题是用户可能会快速导航,这意味着 Router.run
回调在第一个数据进来之前被再次调用。所以你需要确保你中止了最后一个操作而不是完全渲染它。
我来自 Angular,习惯了 ui-router 的解析功能,这使得等待和将结果注入控制器变得容易。
目前,我想在使用 React Router 时通过 React 来模拟这一点,而不必在 componentWillMount
方法中编写请求(或触发操作)。我觉得有更好的方法,只是还没想好。
很想得到一些建议或指出我可以在哪里学习这样做
最好的办法是使用 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);
});
在该函数中,您可以在调用 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);
});
});
这种方法的问题在于,在数据可用之前,您的 UI 根本不会做出反应。相反,我建议使用空状态渲染您的组件,并在 componentDidMount
中获取数据,然后在数据进入时重新渲染。或者更好的是,将数据获取和渲染分成两个组件。一个组件获取数据,并将其作为 属性 传递给呈现组件。除非数据存在,否则数据获取组件甚至可以避免渲染其他组件,例如:
render: function () {
if (this.state.data) {
return <TheComponent data={this.state.data} />;
} else {
return <Spinner />;
}
}
这是 React 中的一种常见模式,用于将处理数据获取和状态的组件与呈现该状态的组件分开。您希望将有状态组件尽可能向上推到层次结构中,因为它创建了一个逻辑边界。有状态的组件是 90% 的错误发生的地方,当你在寻找错误时能够专注于这些是很好的。
等待的另一个问题是用户可能会快速导航,这意味着 Router.run
回调在第一个数据进来之前被再次调用。所以你需要确保你中止了最后一个操作而不是完全渲染它。