2017-10-22 3 views
0

Ich bin mir nicht sicher, wie Sie die state ordnungsgemäß in redux aktualisieren. Ich bekomme doppelte Einträge.Nicht sicher, wie State in Redux richtig zu aktualisieren

Das ist, wie die state wie

const STATE = { 
    windowOne: { ... } 
    windwoTwo: { ... } 
    windowThree: { ... } 
} 

Das

ist eine meiner Reduzierungen sieht
export default function reducer(state = STATE, action) { 
    switch (action.type) { 
     case type.WINDOW_ONE: { 
      return { 
       ...state, 
       windowOne: { 
        ...state.windowOne, 
        foo: action.bar, 
       } 
      } 
     } 
    } 
} 

ich den Zustand wie an den Stützen meiner Komponente

function mapDispatchToProps(dispatch) { 
    return bindActionCreators(combinedActions, dispatch); 
} 

const mapStateToProps = state => { 
    const { windowOne } = state.windowOne; 

    return { 
     windowOne, 
    }; 
} 

export default connect(mapStateToProps, mapDispatchToProps)(SomeComponent); 

Und ich Karte kombinieren Sie die verschiedenen Reduzierungen hier

Wenn ich redux-logger verwende, sehe ich, dass in windowOne die ganze state kopiert wird. Dort, nach dem Auslösen einer action, finde ich windowTwo und windowThree. Ich bin auch nicht sicher, warum ich windowOne in diesen Zeilen angeben müssen

const { windowOne } = state.windowOne; 

Sollte nicht const { windowOne } = state genug sein? Das könnte verwandt sein ...

Antwort

0

Überprüfen Sie die docs für combineReducers; es sorgt dafür, dass jeder Reducer das entsprechende Stück des Zustands sendet und die Ergebnisse zusammenführt. Für die Reduzierung gezeigt, dann können Sie es den Anfangszustand für windowOne nur und zurück nur den aktualisierten Zustand für windowOne passieren sollte:

export default function reducer(state = STATE.windowOne, action) { 
    switch (action.type) { 
     case type.WINDOW_ONE: { 
      return { 
       ...state, 
       foo: action.bar, 
      } 
     } 
    } 
} 

Nach diesem const { windowOne } = state in mapStateToProps sollte funktionieren. Beachten Sie auch, dass in jedem Reduzierer ein Standardfall erforderlich ist, da alle Reduzierungen alle Aktionen erhalten und dass STATE geeignetererweise initialState genannt wird.

+0

Hm, ich hatte es so vor. Aber ich habe es in den Code geändert, den ich geschrieben habe, weil ich Daten zwischen 'windowOne',' windowTwo' und 'windowThree' austauschen muss. Ich dachte, ich übertrage meinen "Reducer" den ganzen "STATE" und gebe dann nur den 'windowOne' Part zurück. Das aktualisiert den 'Zustand' und die neu erzeugten Daten sind in einem anderen 'Reduzierer' zugänglich, wo ich auch 'STATE' übergebe. mit 'STATE.windowOne' sollte ich allerdings auf die aktualisierten Daten zugreifen können ?! – Stophface

+0

Wenn Sie 'combinedReducers' verwenden, wird beim Übergeben und Zurückgeben des gesamten Status eine verschachtelte Kopie in jeder übergeordneten Statuseigenschaft erstellt. Wahrscheinlich möchten Sie entweder einen einzelnen Reducer verwenden oder ein Paket wie 'reduce-reducers' verwenden, wie in [Beyond combinedReducers] erklärt (http://redux.js.org/docs/recipes/reducers/BeyondCombineReducers.html#). sharing-data-zwischen-slice-reducers). – Oblosys

Verwandte Themen