2017-04-14 3 views
0

Ich habe folgende Struktur. Ich habe ein Company Objekt, das viele Person Objekte in einem Array enthält.Aktualisieren der Deep-Eigenschaft eines Objekts mit Redux-Reduzierungen

companies: CompanyInterface = { 
    persons: PersonInterface[] = [] 
} 

Ich versuche, die Personen, die zu dieser Firma gehören, in einer Tabelle zu zeigen. Wenn ich jedoch Personen zum Array personen hinzufüge/lösche, sollte es automatisch aktualisiert werden.

Im Moment sieht mein Minderer wie folgt aus:

// Initial state 
companies: CompanyInterface[]; 

// Reducer 
case Constants.GLOBAL_COMPANY_ADD_PERSON: 
    [action.payload.person].concat(state.companies.filter(company => company.id === action.payload.id)[0].persons)); 

    return { 
    ...state 
    }; 

Obwohl ich Concat richtig überprüfen können funktioniert (ich kann [Person] sehen, wenn ich es log CONSOLLE) es etwas nicht aktualisiert auf dem Speicher.

Also, was ist der beste Weg, um ein Array in Redux zu aktualisieren, die eine Eigenschaft im übergeordneten Objekt ist?

Vielen Dank.

Antwort

-1

Sie können sich vielleicht Array.prototype.concat ansehen, da das Array nicht an Ort und Stelle mutiert, sondern returns a new array. In Ihrem Beispiel mutieren Sie den Zustand nicht.

Stattdessen müssen Sie den alten Wert durch den neuen ersetzen. Zum Beispiel:

case 'ADD_ELEMENT': 
    const { elements: previousElements } = state; 
    const newElement = action.payload; 
    const newElements = previousElements.concat(newElement) 
    return { 
     ...state, 
     elements: newElements 
    }; 
+0

Und wenn ich es mutiere, beschwert sich React über das Mutieren der Daten in Reducers. Kannst du ein wenig weiterarbeiten? Woher bekommst du newElement? Es ist kein Firmenobjekt. action.payload ist ein Objekt, das in die Eigenschaft des Unternehmens verschoben werden soll. – Aris

+0

Das Beispiel soll veranschaulichen, wie das Muster aussehen sollte, siehe http://redux.js.org/docs/introduction/CoreConcepts.html Ihr Codeabschnitt tut offensichtlich nichts. Sie verknüpfen die neue Person einfach mit der vorherigen, ohne den Rückgabewert in einer Variablen zu speichern und dann den vorherigen Zustand zurückzugeben. Wie Sie @momentator erklärt haben, müssen Sie diesen Wert in einer Variablen speichern und dann einen neuen Status mit "Unternehmen" aktualisieren. – gcedo

+0

Ich habe auch Momenators Beispiel versucht. Ich erhalte JS-Fehler, die sagen: "Es wurde eine Mutation in Reducer entdeckt, die verboten ist." Ich bin eigentlich ein bisschen verwirrt. – Aris

Verwandte Themen