2017-03-06 2 views
1

das ist mein Reduzierer. Ich möchte meine Daten in Reducer ohne Duplizierung basierend auf ID aktualisieren.So aktualisieren Sie Daten im Reduzierzustand in reagieren

Kann mir bitte jemand helfen.

Dies ist mein Code:

export const dataReducer = (state= InitialState , action = null) => { 
    switch(action.type) { 
    case types.UPDATE_DATA: 
     return Object.assign({}, state, { 
    data: [ 
     ...(state.data.filter(item => (item.id !== action.payload.id))), 
     action.payload 
    ] 
    default: 
     return state; 
    } 
} 

Ich möchte id löschen: 2 und wollen neue Daten in den Zustand hinzuzufügen.

var state = { 
    data: [ 
    {id: 1, data: "Hello"}, {id: 2, data: "World"} 
    ] 
} 
var payload= {id:2, data: "SO"} 
var data1 = state.data.map(function(item){return (item.id == payload.id)? payload: item}) 

var data = {...state, 
       data: data1 
      } 
console.log(data); 

Es sollte aktualisiert werden

var state = { 
    data: [ 
    {id: 1, data: "Hello"}, {id: 3, data: "Value"} 
    ] 
} 
+0

was jetzt hapening und was erwarten Sie –

+0

Ich habe einige Daten in meinem Zustand Minderer, ich will basierend auf ID, die Daten zu überschreiben. –

+1

Könnten Sie wie die Daten veröffentlichen? oder wie ID-s darin angeordnet sind? – Shota

Antwort

3

Dadurch werden die Daten aktualisieren. wenn es mit dem Objekt im Array übereinstimmt.

export const dataReducer = (state= InitialState , action = null) => { 
     switch(action.type) { 
     case types.UPDATE_DATA: 
      return Object.assign({}, state, { 
       data: state.data.map(item => { 
        return item.id === action.payload.id ? action.payload : item; 
       }); // replace matched item and returns the array 
      }); 
     default: 
      return state; 
     } 
    } 

wenn Sie bereits vorher löschen möchten, und neue Daten hinzufügen, dann können Sie dies einmal versuchen.

export const dataReducer = (state= InitialState , action = null) => { 
     switch(action.type) { 
     case types.UPDATE_DATA: 
      return Object.assign({}, state, { 
       data: state.data.filter(item => { 
        return item.id !== action.id; //delete matched data 
       }).concat(action.payload); //concats new data 
      }); 
     default: 
      return state; 
     } 
    } 
+0

Nein, es funktioniert nicht –

+0

Dies bedeutet im Grunde ersetzt das Element mit Nutzlast, wenn es übereinstimmt. – duwalanise

+0

Es funktioniert. Aber das Problem ist, wenn ich die erste ID aktualisiert habe, wird die zweite ID zum ersten Indexplatz gehen, dann wird die dritte ID zum zweiten Indexplatz gehen. Es sollte ersten Index ersetzen, wenn ich erste Daten aktualisieren. –

0

Nun, Sie Lösung hängt von der Art und Weise Sie Datenobjekt organisiert ist. Wenn Ihr Datenobjekt wie im Beispiel unten angegeben ist, funktioniert die Syntax und die Map des Spread-Operators gut.

var state = { 
 
    data: [ 
 
    {id: 1, data: "Hello"}, {id: 2, data: "World"} 
 
    ] 
 
} 
 
var payload= {id:2, data: "SO"} 
 
var data1 = state.data.map(function(item){return (item.id == payload.id)? payload: item}) 
 

 
var data = {...state, 
 
       data: data1 
 
      } 
 
console.log(data); 
 
    

Ihr Code

export const dataReducer = (state= InitialState , action = null) => { 
    switch(action.type) { 
    case types.UPDATE_DATA: 
     var temp = state.data.map(function(item){return (item.id == action.payload.id)? action.payload: item}) 
     return {...state, 
      data: temp 
     } 
    default: 
     return state; 
    } 
} 
+0

kein sein nicht –

+0

Arbeits Aber ich möchte alte Daten löschen und neue Daten hinzufügen. Ich habe erwähnt avove. –

+0

wo geben Sie an, welche ID Sie löschen müssen –

Verwandte Themen