你可以做這樣的事情在陣營路由器通過組件類添加static
(使用createClass
)或屬性(使用ES6類時),然後做出反應路由器執行它們。
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
)返回一個承諾:(詳情請參閱this React Router example)
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);
});
});
可以解決,確保「多個組件獲取相同的數據」的問題API
模塊將捕獲相同數據的請求併爲其分配相同的承諾。僞代碼:
API = {
getData: function(params) {
if (requests[params]) {
return requests[params];
} else {
request[params] = new Promise(function(resolve, reject) {
// fetch data here
});
}
}
};
它不一定是承諾或servicecalls被觸發,但我明白你的觀點。擴展它是否可以直接在路由標記中添加一些內容(動作或其他道具)?由於每條路線都需要發起自己的行動。就像我與<例如路由解決 – thsorens
@thsorens我不是肯定的附加屬性'' 在做任何事情都(其實我不能看到他們的任何地方,甚至堅持)。 –
我給你正確的答案,雖然它並沒有完全解決我需要的東西,我想限制在於react-router庫。你解決方案可能會工作,雖然它有點不同的方法:) – thsorens