我有一個「活動」減速機/商店的REDX應用程序。添加邏輯到商店?
目前我有重複的代碼來檢查是否加載了特定的廣告系列或需要API調用來從數據庫中獲取詳細信息。大大簡化它看起來像這樣:
// Reducer ----------
export default campaignReducer => (state, action) {
const campaignList = action.payload
return {
items: {... campaignList}
}
}
// Component ----------
const mapStateToProps = (state, ownProps) => {
const campaignId = ownProps.params.campaignId;
const campaign = state.campaign.items[campaignId] || {};
return {
needFetch: campaign.id
&& campaign.meta
&& (campaign.meta.loaded || campaign.meta.loading),
campaign,
};
}
export default connect(mapStateToProps)(TheComponent);
現在我不喜歡重複複雜的條件needFetch
。我也不喜歡在mapStateToProps函數中有這個複雜的代碼,我想要一個簡單的檢查。所以,我想出了這個解決方案:
// Reducer NEW ----------
const needFetch = (items) => (id) => { // <-- Added this function.
if (!items[id]) return true;
if (!items[id].meta) return true;
if (!items[id].meta.loaded && !items[id].meta.loading) return true;
return false;
}
export default campaignReducer => (state, action) {
const campaignList = action.payload
return {
needFetch: needFetch(campaignList), // <-- Added public access to the new function.
items: {... campaignList}
}
}
// Component NEW ----------
const mapStateToProps = (state, ownProps) => {
const campaignId = ownProps.params.campaignId;
const campaign = state.campaign.items[campaignId] || {};
return {
needFetch: state.campaign.needFetch(campaignId), // <-- Much simpler!
campaign,
};
}
export default connect(mapStateToProps)(TheComponent);
問題:這是一個很好的解決方案,還是在終極版結構指望一個不同的模式來解決這個問題?
問題2:我們應該getter方法添加到店,喜歡store.campaign.getItem(myId)
增加環衛(確保身份識別碼存在且被加載,..)或有在終極版此不同的做法?
乾淨多了!我喜歡這個解決方案 - 它絕對是比我的嘗試更好的「減少」解決方案 – Philipp