2016-08-19 18 views
3

eine App mit initialStore = {users: {}} gegeben, in der jeder Benutzer in Benutzer über seine ID als Schlüssel gespeichert wird, wenn eine Komponente eine Liste von Benutzern anzeigt, wenn ein einzelner Benutzer innerhalb dieses Objekts aktualisiert wird, wird die gesamte Liste re -Rendered, was erwartet wird, da der Reducer ein neues Objekt als einen Zustand zurückgegeben hat, obwohl alles, was der Reducer tatsächlich benötigte, einen einzigen Schlüssel änderte.ist es möglich, verschachtelte Reduzierungen in redux zu haben?

Beispielcode

ducks/users.js 
const LoadAllAction =()=>({ type:'USERS/LOAD',users:{1:{id:1,if:0},2:{id:2,if:0}} }); 
const LoadSingleAction =()=>({ type:'USERS/SINGLE',user:{id:2,if:1} }); 

//THIS REDUCER HANDLE THE USERS SLICE OF STORE 
const reducer = (state={},action)=>{ 

if(action.type === 'USERS/LOAD')return action.users; 

if(action.type === 'USERS/SINGLE')return Object.assign({},state,{[action.user.id]:action.user}); 

return state; 
} 

const rootReducer = combineReducers({users:reducer}); 
const store = createStore(rootReducer, {users:{}}); 

oben ist eine Einrichtung des Problems Ich unter .. jetzt ein einfaches Reagieren Komponente gegeben, die

const UsersPage = props=>(
    <ul> 
     {Object.keys(props.users).map((u)=>(
      <li key={u.id}>ID :: {u.id}</li> 
     ))} 
    </ul> 
); 

const mapStateToProps(state)=>({users:state.users}); 

const component = connect(mapStateToProps)(UsersPage); 

nun in der Komponente oben zu speichern verwenden eine Verbindung zu abonnieren Wenn ein einzelner Benutzer den Benutzerspeicher ändert, wird die gesamte usersPage-Komponente erneut gerendert.

vorausgesetzt, dass Benutzer speichern kann über 10.000 Benutzer halten. Wie kann ich meine Reducer/Redux-Struktur aktualisieren, so dass, wenn ein einzelner Benutzer innerhalb des Benutzerspeichers aktualisiert wird .. nur Komponenten, die diesen einzelnen Benutzer anhören, erneut rendern?

i versucht, die oben ul in zwei Komponenten Puting Li in separate Komponente und den Anschluss an redux Ansicht verbinden Passieren der

///LiComponent connect function example 
const mapStateToProps(state,ownProps)=>({users:state.users[ownProps.key]}); 

doch jetzt sowohl ul und Li Wieder rendert aufzuspalten. so kam es zu mir, dass das Problem ist, dass mein Reducer jedes Mal, wenn es einen einzelnen Benutzer aktualisieren muss, einen neuen Benutzerspeicher zurückgibt, also muss ich einen Unterreduzierer für jeden Benutzer haben, wenn ich dies verhindern möchte.

aber von dem, was ich verstehe redux speichern müssen flach sein und reducers nur Scheibe durch Schlüssel, nicht durch Unterschlüssel.

-ist es möglich/UND NORMAL/dass Sie reducers in Redux nest?

mit normal ich meine ich sah Tonnen von einfachen todos apps herum, die noch nie eine echte Welt groß angelegte App-Struktur da draußen gesehen haben, die uns aus diesem herausführen kann, also wie macht Redux Gurus dies während der Planung dort apps?

Antwort

3

Erstens: Ja, es ist absolut möglich, Reduzierfunktionen auf verschiedene Weise zu verschachteln. Sie sind schließlich nur Funktionen, und es liegt ganz bei Ihnen, wie Sie diese Logik aufbauen wollen. Der Standardansatz für das Problem, das Sie beschreiben, ist Normalisieren Ihren Zustand, so dass Sie "Nachschlagetabellen" haben, wo jedes Element nach seiner ID und Arrays von IDs, die alle Elemente darstellen können, gesucht werden kann . Die Elternliste würde dann verbunden werden, ein Array von IDs abrufen und eine ID an jedes Kindlistenelement übergeben. Jede Listenelementkomponente würde verbunden sein, ihre Element-ID als eine Stütze erhalten und diese verwenden, um ihr eigenes Element in nachzuschlagen.

Ich habe eine Reihe von Links bekommen, die diese Art von Ansätzen beschreiben:

+0

aber obwohl ich ID zum verbundenen listItem übergebe, wird die ganze Liste immer noch als Antwort auf die Änderung im Listenstatus nach der Aktualisierung eines Artikels innerhalb von rechts aktualisiert? – Zalaboza

+0

oh. also meinst du, ich sollte etwas wie 'Object.keys (state.users)' in der Elternkomponente verwenden, damit das nächste Mal, wenn es überprüft wird, den gleichen Wert hat, so dass Eltern nicht ausgeführt werden? ! jetzt verstehe ich, was du unter Normalisierung meinst, ich dachte 'es ist ein flaches Objekt, wie kann ich es mehr normalisieren: D!' – Zalaboza

+0

Normalerweise würde eine normalisierte Struktur für einen bestimmten Datentyp folgendermaßen aussehen: '{users: {byId: {1: {}, 98: {}, 123: {}}, Elemente: [1, 98, 123]} } '. Sie haben also bereits ein Array aller Artikel-IDs im Status. – markerikson

Verwandte Themen