2017-01-22 5 views
1

In dem example ‚s src (UserPage.js):über Normalisierung in redux realen Welt Beispiel

const mapStateToProps = (state, ownProps) => { 
    // We need to lower case the login due to the way GitHub's API behaves. 
    // Have a look at ../middleware/api.js for more details. 
    const login = ownProps.params.login.toLowerCase() 

    const { 
    pagination: { starredByUser }, 
    entities: { users, repos } 
    } = state 

    const starredPagination = starredByUser[login] || { ids: [] } 
    const starredRepos = starredPagination.ids.map(id => repos[id]) 
    const starredRepoOwners = starredRepos.map(repo => users[repo.owner]) 

    return { 
    login, 
    starredRepos, 
    starredRepoOwners, 
    starredPagination, 
    user: users[login] 
    } 
} 

ich feststellen, dass es viele Vorlagen wie xxx.ids.map(id => someEntities[id]) ist, bin ich nicht sicher, warum dieses Muster verwenden, um Arbeit .IMO, würde ich etwas wie import { map } from 'lodash'; someList && map(someList, item => {...}) in der Container-Komponente verwenden und einfach die Entitäten in der mapStateToProps übergeben.

Also, könnte jemand seinen Zweck erklären? Danke.

+0

Nicht ganz sicher, verstehe ich die Frage. Fragen Sie nach der Idee der Zuordnung über IDs, um eine Liste von Elementen zu erhalten, oder die Verwendung von 'Array.map()' anstelle von '_.map()'? – markerikson

+0

Danke für die Antwort. Ich meine, es ist nicht notwendig, "über IDs abzubilden, um eine Liste von Elementen zu erhalten", wir können einfach etwas tun, wie 'importieren {map} von 'lodash'; someList && map (someList, item => {...}) ', um auch gut zu funktionieren.Wir verwenden' lodash.map' und nicht 'Array.prototype.map', weil unsere Daten von der' normalizr'-Bibliothek normalisiert werden, also ist das Objekt ein Objekt und kein Array. @markerikson –

+0

Der Grund von mir bin im Gegensatz zu Way (zB 'xxx.ids.map (id => someEntities [id])') im Beispiel ist, dass die Ergebnisdaten nach diesem Schritt bereits vor diesem Schritt vorhanden sind. Wie ich oben sage, können wir einfach die Entitäten (von den normalisierten Daten durch 'normalizr'-Bibliothek) in der MapStateToProps zu unsererContainer-Komponente @markerikson –

Antwort

2

Der Standardvorschlag zum Normalisieren von Daten in Redux ist das Speichern von Datenelementen in einem Objekt mit IDs als Schlüssel und Elementen als Werte. Ein Objekt hat jedoch keine inhärente Reihenfolge. (Technisch gesehen ist die Reihenfolge der Iteration für Objektschlüssel sollte konsistent sein, aber es ist eine schlechte Praxis auf, dass als alleiniges Mittel zur Ordnung zu verlassen.)

Aus diesem Grunde ist es auch Standard eine Reihe von einfach zu speichern, die IDs auch. Ein typisches Beispiel könnte wie folgt aussehen:

{ 
    byId : { 
     qwerty : { }, 
     abcd : { }, 
     aj42913 : { }  
    }, 
    items : ["qwerty", "aj42913", "abcd"], 
    sorted : ["abcd", "aj42913", "qwerty"], 
    selected : ["qwerty", "abcd"] 
} 

In diesem Beispiel items enthält all Element-IDs, die wahrscheinlich in der Reihenfolge Einsatz sie waren. sorted enthält die IDs in einer sortierten Reihenfolge, während selected eine Teilmenge der IDs enthält.

Dadurch können die Objekte selbst nur einmal gespeichert werden, während mehrere Darstellungen dieser Objekte mit verschiedenen ID-Arrays gespeichert werden können.

Von dort aus können Sie eine Liste der tatsächlichen Elemente zusammenstellen, indem Sie das Array der IDs, die Ihnen wichtig sind, zuordnen und die Objekte anhand ihrer IDs abrufen.

also letztlich die Antwort ist, dass nur auf den Tasten des byId Objekt verlassen Sie jede Art von Ordnung nicht geben, und erlaubt keine Teilmengen der Daten zu definieren.

+1

Danke für Sie antworten.In meinem Projekt , es gibt einige Items, die sehr einfach sind (zB es gibt kein Nest) und ihre ID ist nur die Nummer (zB die Reihenfolge der Iterate muss das gleiche wie das Array sein), deshalb schreibe ich diese Frage. Aber ich bin Sicher, ich weiß, was du meinst.So, nochmals vielen Dank! @markerikson –

Verwandte Themen