2017-03-28 4 views
1

Ich habe eine Liste von Schülern und meine App zeigt immer einen Schüler zu der Zeit, den activePupil. Ich habe bisher zwei Reduzierungen. Eine enthält und durch Standard gibt eine Liste aller Kinder (in Form eines Arrays):Zugang zu einem Reduzierstück von einem anderen Reduzierstück?

[ 
{ 
    id: 1 
    name: Barack 
}, 
{ 
    id: 2 
    name: Donald 
} 
] 

... dann habe ich eine activePupilReducer, der die aktuellen Schüler enthält betrachtet wird. So z.B.

{ 
    id: 2 
    name: Donald 
} 

Jetzt weiß ich nicht, wie man zum nächsten Schüler iteriert. Wenn die Aktion "UPDATE_ACTIVE" ausgelöst wird, möchte ich, dass mein activePupilReducer den aktiven Schüler zum nächsten Schüler aktualisiert. Also müsste ich die aktuelle ID meines Schülers schnappen, sie wiederholen und dann den Schüler mit der richtigen ID von dem anderen Reducer schnappen (oder das ist es, was ich annehmen muss). Gerade jetzt meine activePupilReducer sieht wie folgt aus:

export default function (state={id: -1, name:"John"}, action) { 
    switch (action.type) { 
     case "UPDATE_ACTIVE": 
     // ?? 
     default: 
     return state; 
    } 
} 

Ich würde irgendwie die andere Minderer müssen packen und das nächste Element packen, aber ich habe keine Ahnung, wie ich über diese gehen würde.

Antwort

1

scheint mir, dass die aktive Schüler und Liste der Schüler von Natur aus in der gleichen Reducer leben sollte. So habe zum Beispiel einfach einen Pupillenreduzierer, dessen Zustand ein Objekt ist. Dann haben Sie Ihre Aktionen wie Sie es gerade tun.

Auch gesagt, Reduzierer sollen rein von irgendwelchen Nebenwirkungen sein und ist daher nicht der Ort zu tun, was Sie suchen zu tun. Was Sie tun könnten, ist, den nächsten Schüler außerhalb Ihres Reduzierers/Ihrer Aktion zu berechnen, zum Beispiel auf Knopfdruck in einer Komponente und dann an Ihre update_active Aktion weiterzuleiten, die diese dann in Ihren Reduzierer übergibt, um ihn als aktiven Schüler zu setzen.

+0

also, wenn ich dich richtig verstehe, bin ich völlig auf dem falschen Weg, versuchen, diese Funktion im Reducer zu implementieren? Es ist lustig, weil ich es momentan in meiner Aktion habe, dachte aber, ich würde dort ein Anti-Pattern implementieren. –

0

Der Umfang Ihrer activePupilReducer ist nicht breit genug. Es sollte in der Lage sein, sowohl den activePupil-Schlüssel als auch das pupils-Array zu sehen, um zu arbeiten.

Wenn Sie combineReducers verwenden, geben Sie ihnen wahrscheinlich keinen Zugriff auf den Status des anderen. Sie sollten diese beiden Reduzierungen in ein, und verwenden Sie die folgende Zustandsstruktur verschmelzen:

{ 
    pupils: [...] 
    activePupil: {...} 
} 

Wenn Sie die UPDATE_ACTIVE Aktion, dieses einzelne Minderer aufrufen mit Zugang zu den beiden Tasten und in der Lage, den Zustand Mutation durchzuführen.

+0

Ich benutze Mähdrescher, so dass mein Laden am Ende aussieht wie der, den du zitierst. Würde ich dann, wenn ich Sie richtig verstehe, diese Funktion einfach in meinen kombinierten Reducer implementieren, da ich auf beide Daten zugreifen muss? –

+0

Ihr Reduzierer sollte Zugriff auf ** beide ** Einträge haben. Sie müssen ** beide ** unter dem gleichen Schlüssel im Geschäft platzieren, damit sie mit demselben Reduzierer zugänglich sind. Also, 'store = {data: {pupils, activePupil}}' – slezica

Verwandte Themen