2016-11-21 29 views
2

我有一個使用Immutability.js的React + Redux應用程序。在我的減速器我有狀態定義爲不可變列表Immutable JS - 如何用新列表替換列表

const initialSuggestedResponseState = Immutable.List([]);

每當一個特定的動作發生,我想用一個新的列表來取代這個名單。我想我缺少一些與Immutability.js的東西,因爲我一直無法找出一個可行的解決方案。到目前爲止,我已經嘗試過這樣的事情:

 state.clear(); 
     action.messages.forEach(message => { 
      let newResponse = new suggestedResponseRecord({ 
       body: message.body, 
       responseId: message.response_id, 
       type: message.type 
      }); 
      state.push(newResponse); 
     }); 
     return state; 

然而,這什麼不壓到我的清單。爲什麼這不起作用,什麼是適當的方法?我確信有更簡單的事情。

感謝提前:)

回答

3

對任何類型的不可變對象做state.push返回一個新的對象。現有狀態不會被修改,這就是爲什麼在推送狀態後返回狀態不起作用的原因。快速入門將是將state.push(newResponse);更改爲state = state.push(newResponse);。我建議你如何一成不變結構工作:)

+0

啊!是的,這是非常有意義的。謝謝:) –

+0

這打破了不變性的目的。 – Emobe

+0

這就是爲什麼我說這是一個快速破解,使其工作 – zackify

1

作爲後續zackify的答案,這裏是你可以採取簡化你的代碼的一種方法更讀了起來:

return new List(action.messages.map(message => { 
    return new suggestedResponseRecord({ 
     body: message.body, 
     responseId: message.response_id, 
     type: message.type 
    }); 
}); 

這將創建一個記錄數組從您的消息數組中(使用Array.prototype.map),然後將該新數組轉換爲不可變列表。不知道這是否是最有效的做事方式,但它很可讀。