У меня есть приложение redux с редуктором/магазином «кампания».Добавить логику в магазин?
В настоящее время у меня есть повторный код, чтобы проверить, загружена ли определенная кампания или требуется вызов 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: Если мы добавим методы геттер в магазин, как store.campaign.getItem(myId)
добавить санитарии (убедитесь, что MyId существует и загружен, ..) или есть другой подход, для этого в Redux?
намного чище! Мне нравится это решение - это, безусловно, лучшее решение «сокращение», чем моя попытка – Philipp