使用 Immutable.js 的 Record、Redux 與 Typescript 的樹狀模型結構
我從我的 API 收到一個扁平的結構:
{
"users": [
{"id": 123, "name": "Peter"},
{"id": 124, "name": "John"}
],
"threads": [
{"id": 1, "participantIds": [123, 124, 125]},
{"id": 2, "participantIds": [879, 888]}
]
}
其中 participantIds 指的是用戶「實體」.
我希望將數據儲存在 Redux 的方式中,即不可變的平面結構。為了方便,我創建了 Record 實體,我希望在我的 React 組件中將它們作為輸入(props)接收:
export class User extends Immutable.Record({})
{
id: string;
name: string;
}
export class Thread extends Immutable.Record({})
{
id: string;
paticipants: Immutable.Map<string, User>;
}
由於 Redux 的扁平結構不同,我不確定如何正確地構建這個架構。這裡是我可能已經做的一個小總結:
使用 Reselect 函式庫並將平面狀態轉換為樹狀狀態。
- 將資料儲存為原始的 Immutable.js Map 和 List,然後在選擇器中將它們轉換為實體。
- 引入屬性 Thread->participantIds,並在重新選擇時填充 Thread->participants,因此在運行選擇器之前該屬性為空。
- 在中間創建一個層,類似於 MVVM,這樣我就會有兩種類型的實體,一個用於存儲數據,另一個用於傳遞給 React 組件。
我不喜歡這些可能的解決方案中的任何一個。對於如此常見且簡單的使用情況,它們看起來都相當冗長。
我在這裡找到了一個小討論:https://github.com/rackt/redux/issues/815 但我沒有得到我需要的答案。