2016-04-26 18 views
1

Ich habe ein Dashboard mit Widgets und sie sind abhängig vom aktuellen Benutzer. Wir wissen also nicht, welche Widgets zur Kompilierzeit geladen werden. Das heißt, der Staat wird auch dynamische Felder für diese Widgets haben. Ich habe eine Reduzierung für jedes Widget. Wie kombiniere ich alle Reduzierungen von benötigten Widgets?Dynamische Kombination von Reduzierungen

Mein Zustand kann wie folgt aussehen:

{ dashboardId: 12, 
    widgetList:{ 

     w1: { 
      widgetTitle:'widget 1' 
      data:[] 
     }, 
     w2:{ 
      widgetTitle:'widget 2' 
      data:[] 

     } 
    } 
} 

Jetzt möchte ich Reduzierungen kombinieren:

combineReducers({ 
    w1:widget1Reducer, 
    w2:widget2Reducer 
}) 

Nun ist das Problem, das wir nicht wissen, welche alle Widgets für das aktuelle Armaturenbrett laden gehen .

Antwort

1

Sie müssen mehrere Reduzierungen nicht mithilfe des Helpers kombinieren. Erstellen Sie einen widgetList Minderer, die angegeben Widget mit den entsprechenden Widget Minderer aktualisieren:

function widgetList(state = {}, action) { 
    switch (action.type) { 
    case WIDGET_A_FOO: 
    case WIDGET_A_BAR: 
     return { 
     ...state, 
     [action.id]: widgetA(state[action.id], action), 
     } 

    case WIDGET_B_BAZ: 
     return { 
     ...state, 
     [action.id]: widgetB(state[action.id], action), 
     } 

    case DELETE_WIDGET: 
     return _.omit(state, action.id) 

    default: 
     return state 
    } 
} 

Im obigen Beispiel hält action.id das Widget ID. widgetA und widgetB sind die Reduzierungen von Widget A und Widget B.

+0

Danke, das war ordentlich :) – user1803361

+0

Der einzige Nachteil, den ich sehe, ist, dass wir am Ende importieren Reduzierungen für alle Widgets (~ sagen 100). Ich benutze Webpack, gibt es eine Möglichkeit, nur die benötigten Reduzierungen für die aktuelle Seite herunterzuladen? – user1803361