2016-03-30 4 views
0

Ich habe einen einfachen SEARCH_SUCCESS Minderer, die updates api Antwort in dem Zustand von id wie folgt abgebildet:

[searchActionTypes.SEARCH_SUCCESS]: (state, { companies }) => { 
    return update(state, { $merge: _.indexBy(companies, '_id') }) 
}, 

jedoch, weil mein Zustand von id abgebildet wird, dann ist dies alle bestehenden Unternehmen in Staat zu ersetzen. Dies ist ein Problem, da ich zusätzliche Daten, die in bestehenden Unternehmen gespeichert sind, erhalten möchte.

Ich konnte nur durch die Unternehmen durchlaufen und manuell $merge Zustand:

const newState = _.deepClone(state) 
_.forEach(companies, company => newState[company._id] = state[company._id] ? 
    update(state[company._id], { $merge: company }) : company 
) 
return newState 

Aber das fühlt sich klobig. Gibt es eine elegantere Möglichkeit, den verschachtelten Zustand zu aktualisieren, wenn die Schlüssel $merge oder $set nicht vorhanden sind, wenn Schlüssel nicht vorhanden sind?

+0

Verwandte: https: // Stackoverflow .com/questions/32135779/Aktualisierungs-Nested-Data-in-Redux-Speicher. Siehe auch https://github.com/gaearon/normalizr. –

+0

Die Frage, auf die Sie verwiesen haben, ist eine allgemeine Frage zum Aktualisieren des redux-Status mit einer akzeptierten Antwort, die react-addons-update empfiehlt. Ich benutze diesen Helfer bereits und verlinke ihn in meiner Frage. Abramov (Schöpfer von Redux) antwortet ebenfalls und empfiehlt Normalizer. Meine Daten sind bereits normalisiert, weshalb ich Datensätze nach ID indexiere. –

+0

Um zu verdeutlichen, behebt meine Frage einen Mangel des update addon $ merge-Operators, da dieser nur oberflächliche, ähnlich wie lodash assign, zusammenführt. –

Antwort

1

Nach einiger Fummelei, ich aufgegeben nur das Update $merge Operator, weil es im Wesentlichen gleichwertig ist assign lodash und ging mit einer Kombination aus lodash cloneDeep und merge wie folgt aus:

[dupeSearchActionTypes.SEARCH_SUCCESS]: (state, { companies }) => { 
    // manually _.merge companies into state because react-addons-update $merge is shallow 
    return _.merge(_.cloneDeep(state), _.indexBy(companies, '_id')) 
}, 
Verwandte Themen