2016-06-20 13 views
18

Ich steckte mit diesem Bit und ich kann nicht Fortschritte - ich denke Lösung ist einfach, aber ich kann nicht herausfinden. Ich versuche Eintrag in Minderer hinzuzufügen, so dass Daten in in diesen etwas aussehen würde:Redux - Wie man einen Eintrag in Array in Reducer

state = { 
    entryId: { 
    entryName: ["something", "something2", "something3" /* and so on... */] 
    } 
}; 

Bisher ist dies die nächste, die ich bekommen, aber anstatt das Hinzufügen von neuen eindeutigen Eintrag, es ersetzt die das ist schon gespeichert. Auch muss ich diesen Artikel zu leeren Zustand in der Lage sein hinzuzufügen, wo entryId, Eintragsname noch nicht existiert Fehler zu vermeiden:

switch(type) { 
    case ADD_ENTRY: 
    return { 
     ...state, 
     [entryId]: { 
     ...state[entryId], 
     [entryName]: { 
      [uniqueEntry]: true 
     } 
     } 
    }; 
} 

Jede Idee, was ich falsch mache?

+0

Können Sie einen weiteren Kontext zu dem Beispiel schreiben? Können Sie beispielsweise die _shape_ der Aktion anzeigen, mit der Sie Intros Reducer bearbeiten? –

+0

Ich versende etwas wie folgt: addEntry ({entryId, entryName, uniqueEntryid}) – eloleon

+0

Versuchen Sie Folgendes: [link] (https://babeljs.io/repl/#?evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage -2% 2Stufe-3 & code = const% 20State% 20% 3D% 20% 7B% 0D% 0A% 20% 20Eintritt% 3A% 20% 7B% 0D% 0A% 20% 20% 20% 20EintragName% 3A% 20% 5B % 22etwas 22 22% 2% 20% 22etwas 2% 22% 2% 20% 22etwas 3% 22% 5D% 0D% 0A% 20% 20% 7D% 0D% 0A% 7D% 3B% 0D% 0A% 0D% 0Aconst% 20newState % 20% 3D% 20% 7B% 0D% 0A% 20% 20% 5B% 22Einsatz% 22% 5D% 3A% 7B% 0D% 0A% 20% 20% 20% 20% 5B% 22eintragName% 22% 5D% 3A % 20% 5B ... state% 5B% 22entryId% 22% 5D% 5B% 22eintragName% 22% 5D% 2C% 22etwas 4% 22% 5D% 0D% 0A% 20% 20% 7D% 0D% 0A% 7D% 3B % 0D% 0A% 0D% 0Aconsole.log (newState)% 3B & experimentell = wahr & los = falsch & spec = falsch) – jzm

Antwort

22

Wenn Sie versuchen, ein Element an das Ende des entryName Array hinzufügen Sie tun sollten:

return { 
    ...state, 
    [entryId]: { 
    ...state[entryId], 
    [entryName]: [ 
     ...state[entryId][entryName], 
     uniqueEntry 
    ] 
    } 
}; 

ES6 Aufstrich mit Arrays funktioniert wie folgt:

const array1 = [1, 2, 3]; 
const array2 = [4, 5, 6]; 
const eight = 8; 

const newArray = ['stuff', ...array1, 'things', ...array2, ...[7, eight], 9]; 
console.log(newArray); // ["stuff", 1, 2, 3, "things", 4, 5, 6, 7, 8, 9] 

prüfen out this gist, die ein Beispiel für etwas hat, das dem, was Sie tun, sehr ähnlich ist.

Ich fand diese Beispiele auch sehr hilfreich. Viele tolle Sachen hier:

https://github.com/sebmarkbage/ecmascript-rest-spread

Update:

Wenn entryName-undefined initialisiert wird, wie Sie in Ihrem Kommentar sagen, könnten Sie dies tun:

return { 
    ...state, 
    [entryId]: { 
    ...state[entryId], 
    [entryName]: [ 
     ...state[entryId][entryName] || [], 
     uniqueEntry 
    ] 
    } 
}; 

Ich denke, Dies ist ein ziemlich gutes Beispiel dafür, wie schmerzhaft es sein kann, mit React/Redux unter Verwendung einer stark verschachtelten Datenstruktur zu arbeiten. FWIW, mir wurde oft empfohlen, deinen Staat so weit wie möglich zu verflachen.

+0

Danke Dannyid! Ich habe die gleiche Sache versucht und das Problem ist, dass der Anfangszustand ein leeres Objekt ist, so wird diese Zeile '... state [entryId] [entryName]' Fehler – eloleon

+0

Ahh, das ist ein wichtiger Teil der Info! Können Sie Ihre Frage aktualisieren und ich werde meine Antwort aktualisieren? – jaybee

+0

Ich werde die Frage jetzt aktualisieren.Übrigens habe ich mein Problem mit ziemlich genau dem gleichen Ansatz bearbeitet wie du "|| []" – eloleon