2017-05-31 152 views
0

刪除項目沒有不同誘變國家我想的第一件事情是這樣的:在終極版

​​

當控制檯記錄deleteIn以上,但它實際上是從地圖正確刪除的項目。然而,該應用程序不會再次重新渲染,因爲我假設我正在改變狀態(?)。 (mapStateToProps被調用,但沒有新的狀態)。

所以下次我嘗試這樣做:

case 'REMOVE_FROM_CART': 
    const removed = state.deleteIn(['items', String(action.id)]); 
    const removeItemState = { 
    ...state, 
    items: { removed } 
    } 
    return state.mergeDeep(removeItemState); 

但我只是將已刪除項目的項目再次創建一個重複。

我該如何處理?

回答

0

發佈更多的代碼(如我的減速設置)已經幫助了,但這裏發生了什麼事情:

首先,這段代碼是從狀態刪除的項的正確方法。

return state.deleteIn(['items', String(action.id)]); 

但是,因爲我用的是immutable庫和我combineReducers不redux-immutable,我的狀態沒有正確被處理。這讓我可以做像state.cart.items(在mapStateToProps),我真的應該使用state.getIn(['cart', 'items'])

更改,神奇地做了刪除工作。

感謝Reactiflux Immutable Slack頻道中的@jslatts以幫助解決這個問題!

0

你有沒有試過在你有deeply cloned狀態後取出物品?

case 'REMOVE_FROM_CART': 
    const removeItemState = { 
     ...state 
     items: { 
      ...state.items 
     } 
    }; 

    delete removeItemState.items[String(action.id)]; 

    return removeItemState; 
0

如何減少?

case 'REMOVE_FROM_CART': 
    return { 
    ...state, 
    items: Object.keys(state.items).reduce((acc, curr) => { 
     if (curr !== action.id) acc[curr] = state.items[curr]; 
     return acc; 
    }, {}) 
    };