您可以在 React Router 中执行类似的操作,方法是在组件类上添加static
(使用createClass
)或属性(使用 ES6 类时),然后使用 React Router 执行它们。
var Component1 = React.createClass({
statics: fetchData: function(params) {
return API.getData(params);
},
// ...
});
class Component2 extends React.Component {
// ...
}
Component2.fetchData = (params) => API.getData(params);
然后,当您运行路由器时,查找所有匹配的具有fetchData
静态方法的路由并调用它。我们在这里假设fetchData
(因此API.getData
)返回一个 Promise:
Router.run(routes, function(Root, state) {
var data = {};
var routesWithFetchData = state.routes.filter(function (route) {
return route.handler.fetchData
});
var allFetchDataPromises = routesWithFetchData.map(function (route) {
return route.handler.fetchData(state.params).then(function (routeData) {
data[route.name] = routeData;
});
});
Promise.all(allFetchDataPromises).then(function() {
React.render(<Root data={data} />, container);
});
});
(有关更多详细信息,请参阅此 React Router 示例。)
您可以通过确保API
模块将捕获对相同数据的请求并为它们分配相同的承诺来解决“多个组件获取相同的数据”问题。伪代码:
API = {
getData: function(params) {
if (requests[params]) {
return requests[params];
} else {
request[params] = new Promise(function(resolve, reject) {
// fetch data here
});
}
}
};