2016-06-26 27 views
1

In meiner Anwendung ich vielen Teil des Staates, die significative nur, wenn der Benutzer angemeldet istReagieren Redux -. Conditional Wähler

Wenn der Benutzer angemeldet ist, und navigieren direkt zu einer Seite, Router die Seite anzuzeigen muss aber einen asynchronen Anruf tätigen, damit ein Stück des Staates noch nicht besetzt ist.

Nun nehme ich an, dass ich eine Schaltfläche in der Navigationsleiste anzeigen muss, die einen Teil des Status übernehmen muss, aber dieser Status ist seit der asynchronen Aufruffinis nicht ausgefüllt.

Mehr pratically, ich habe diesen Selektor:

export const getSelectedCustomer = state => state.systems.selectedCustomer; 

Damit gibt es kein Problem, denn selectedCustomer Teil des initialState Minderer ist

Das Problem in diesem Selektor ist:

export const getSelectedCustomerName = state => { 
    return state.systems.entities[getSelectedCustomer(state)].customer; 
} 

Der Teil des Staates entities in initialState ist ein leeres Array und wird bevölkert d bei asynchronem Anruf.

Also, wenn die Anwendung starten und i-Karte (mit connect - mapStateToProps) dem Wähler getSelectedCustomerName i den Fehler erhalten, weil entities leer und sicher ist, customer Feld gibt es noch nicht

Eine einfache Lösung, wenn in nehmen Legen Sie einige if-else, aber ich werde dies in "jeder" Teil der Anwendung tun müssen.

Ich frage, ob es eine bessere Lösung ist, diese ...

Antwort

2
const NullCustomerEntities = { 
    customer: "Anonymous" 
} 

export const getSelectedCustomer = state => state.systems.selectedCustomer; 

export const getCustomerEntities = state => { 
    return state.systems.entities[getSelectedCustomer(state)] || NullCustomerEntities; 
} 

export const getSelectedCustomerName = state => { 
    return getCustomerEntities(state).customer; 
} 

Dies ist ein klassisches Beispiel für ein Null Object pattern zu vermeiden (hoffen, dass Sie den Code in Ruby haben nichts dagegen zu sein).

+1

stolperte darüber. Genossen die JavaScript/Ruby-Nebeneinanderstellung. – larz

Verwandte Themen