Ich habe eine Redux-Anwendung mit einem "Kampagne" Reducer/Store.Logik zum Laden hinzufügen?
Derzeit habe ich Code wiederholt, um zu überprüfen, ob eine bestimmte Kampagne geladen ist oder einen API-Aufruf benötigt, um Details aus der Datenbank abzurufen. Viel vereinfacht es wie folgt aussieht:
// 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);
Jetzt habe ich nicht für needFetch
die komplexe Bedingung wiederholen mögen. Ich mag diesen komplexen Code in der Funktion mapStateToProps auch nicht, ich möchte eine einfache Überprüfung haben. So kam ich mit dieser Lösung:
// 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);
Frage: Ist dies eine gute Lösung, oder hat die Redux-Struktur erwartet ein anderes Muster dieses Problem zu lösen?
Frage 2: Sollten wir Getter-Methoden in den Laden, wie store.campaign.getItem(myId)
Hygiene hinzufügen (stellen Sie sicher, myid existiert und geladen wird, ..) oder gibt es einen anderen Ansatz für diese in redux hinzufügen?
Viele sauberer! Ich liebe diese Lösung - es ist definitiv eine bessere "Redux" -Lösung als mein Versuch – Philipp