2017-10-17 97 views
0

我有一個非常簡單的問題,但是...終極版:克隆不工作狀態

的代碼(在終極版/反應原生應用)減速器的:

... 
case SAMPLES_DELETE_REQUEST_SUCCESS: {   
    var newState = Object.assign({}, state); 
    const indexToDelete = newState.samples.findIndex(sample => { 
     return sample.id == action.sample.id 
    }) 
    newState.samples.splice(indexToDelete, 1) 
    debugger; 
    return newState 
    } 
... 

好吧,我複製該狀態並將其存儲到newState中。但是當我做newState.samples.splice(indexToDelete, 1),newState被正確修改的時候,也是state!爲什麼??我一定很累......

回答

2

splice函數修改原始數組。 Object.assign不做深層克隆。因此你仍然在修改原始狀態!

您必須手動複製嵌套的對象(或陣列)要克隆:

// Deep Clone 
obj1 = { a: 0 , b: { c: 0}}; 
let obj2 = JSON.parse(JSON.stringify(obj1)); 
+0

謝謝!你是對的。拯救我的傍晚...... –

2

正如有人提及之前,你可以使用JSON.parse(JSON.stringify(OBJ))創建整個對象的新副本(也是嵌套對象)。如果你不想這樣做,你可以檢查庫,例如Inmutable JS

另外,如果你想使用傳播符號,一個更好的方式來做到這一點是:

return { 
    ...state, 
    samples: state.samples.filter(sample => sample.id !== action.sample.id) 
}