2017-03-06 86 views
1

這是我的減速機。我想根據ID在Reducer中更新我的數據而不會重複。如何在反應中更新減速機狀態的數據

任何人都可以請幫助我。

這是我的代碼:

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; 
    } 
} 

我想刪除ID:2,並希望將新數據添加到狀態。

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); 

它應該被更新,

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

什麼是現在hapening,你希望 –

+0

做什麼,我有一些數據,我減速的狀態,我要覆蓋的ID的數據。 –

+1

你可以發佈數據的樣子嗎?或者它的內部如何排列ID? – Shota

回答

3

這將更新數據。如果它匹配數組中的任何對象。

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; 
     } 
    } 

如果你想刪除以前的並添加新的數據,那麼你可以嘗試一次。

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

沒有它沒有工作 –

+0

這基本上意味着用有效負載替換項目,如果它匹配。 – duwalanise

+0

它的工作。但問題是,如果我更新了第一個ID,第二個ID將首先放在索引位置,那麼第三個ID將放到第二個索引位置。 它應該替換第一個索引,如果我正在更新第一個數據。 –

0

那麼你的解決方案取決於你的數據對象的組織方式。如果您的數據對象如下例所示,那麼使用擴展運算符語法和映射效果很好。

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); 
 
    

您的代碼

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

其不工作 –

+0

但是,我想刪除舊數據,並想添加新的數據,我已經提到avove –

+0

你在哪裏指定你需要刪除的ID –