2017-06-26 4 views
1

Ich habe einen packageReducer, der die Details packageType und packageList enthält. Sobald die Details vom Server abgerufen wurden, muss ich die ursprünglichen Statuswerte durch die neuen Werte ersetzen, die abgerufen wurden. Ich denke, im den ganzen Staat zu ersetzen, als ein Beispiel, wenn die packageLists geholt worden sind, brauche ich nur die „Paketliste“

Im Folgenden meine PackageState ist Minderer, CanSo ersetzen Sie einen Teil des Redux-Status

const initialState = { 
    packageList: packageListInitialState, 
    packageTypes: [{title: 'Select Package Type', value: ''}], 
}; 

export default function packageState(state = initialState, action) { 
    switch (action.type) { 
     case FETCH_PACKAGE_LIST_SUCCESS:{ 
      return Object.assign({}, state, action.payload); 
     } 

     case FETCH_PACKAGE_TYPES_SUCCESS:{ 
      return Object.assign({}, state, action.payload); 
     } 

     default: 
      return state; 
    } 
} 
I

Die Art und Weise umgesetzt haben, zu ersetzen jemand lassen Sie mich wissen, wie ich es erreichen kann?

Vielen Dank.

+0

Können Sie die actionCreators auf die Frage hinzufügen? Es würde helfen, den Inhalt der Aktion zu kennen.payload –

Antwort

1

Sie sind nicht:

var state = {a: 1, b: 2, c: 3} 
 
var newData = {a: 4, b: 5} 
 
console.log(Object.assign({}, state, newData)) // { a: 4, b: 5, c: 3 }

Eigenschaften im Zielobjekt wird durch Eigenschaften in den Quellen überschrieben werden, wenn sie den gleichen Schlüssel haben. Die Eigenschaften der späteren Quellen überschreiben in ähnlicher Weise frühere.()

So, wie Ihre Nutzlast die Schlüssel enthält, die Sie wirklich aktualisieren möchten, sind Sie sicher. Sie können auch auf einfachere Art und Weise tun, wenn Sie ES6 die Verwendung spread syntax (Ich gehe davon aus Ihrer Nutzlast wie {packageList: data} aussieht):

const initialState = { 
    packageList: packageListInitialState, 
    packageTypes: [{title: 'Select Package Type', value: ''}], 
}; 

export default function packageState(state = initialState, action) { 
    switch (action.type) { 
     case FETCH_PACKAGE_LIST_SUCCESS:{ 
      return {...state, ...action.payload}; 
     } 

     case FETCH_PACKAGE_SETTINGS_SUCCESS:{ 
      return {...state, ...action.payload}; 
     } 

     default: 
      return state; 
    } 
} 
+0

Vielen Dank für die Antwort, wenn ich den Ausgangszustand wieder einstellen soll, soll ich es so machen wie unten? 'return {... state, packageList: packageListInitialState};' – Anna

+0

Sie meinen den Standardfall? Nein, Sie müssen einen speziellen Fall haben, der es zurückgibt, sagen 'Fall RESET_PACKAGE_INFORMATION: return initialState;' – martinarroyo

+0

Nein, was ich meinte ist, nach dem Speichern der Einstellungen muss ich die PackageTypes in den Standardzustand versetzen. in Ihrem Beispiel, in der RESET_PACKAGE_INFORMATION Ich muss den packageType auf den Ausgangszustand setzen und die packageList mit den neuesten Werten – Anna

0

Unter der Annahme, dass die Aktion, die Sie versuchen, dies in nur die FETCH_PACKAGE_LIST_SUCCESS Aktion zu erreichen, und die Nutzlast ist die aktualisierte/abgerufene Liste, dann müssen Sie nur ein Objekt wie unten gezeigt zurückgeben.

Da Sie versuchen, ein Objekt zurückzugeben, bei dem nur eine der beiden Eigenschaften geändert wurde, können Sie den Wert des vorherigen Status für die unveränderte Eigenschaft verwenden und die andere Eigenschaft aktualisieren.

const initialState = { 
    packageList: packageListInitialState, 
    packageTypes: [{title: 'Select Package Type', value: ''}], 
}; 

export default function packageState(state = initialState, action) { 
    switch (action.type) { 
     case FETCH_PACKAGE_LIST_SUCCESS:{ 
      return { packageList: action.payload, packageTypes: state.packageTypes } 
     } 

     case FETCH_PACKAGE_SETTINGS_SUCCESS:{ 
      return Object.assign({}, state, action.payload); 
     } 

     default: 
      return state; 
    } 
} 
Verwandte Themen