網站搜尋

使用 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 的扁平結構不同,我不確定如何正確地構建這個架構。這裡是我可能已經做的一個小總結:

  1. 使用 Reselect 函式庫並將平面狀態轉換為樹狀狀態。

    1. 將資料儲存為原始的 Immutable.js Map 和 List,然後在選擇器中將它們轉換為實體。
    2. 引入屬性 Thread->participantIds,並在重新選擇時填充 Thread->participants,因此在運行選擇器之前該屬性為空。
    3. 在中間創建一個層,類似於 MVVM,這樣我就會有兩種類型的實體,一個用於存儲數據,另一個用於傳遞給 React 組件。
  2. 儲存樹的狀態,並對特定(使用者)實體的所有可能出現進行更新。

我不喜歡這些可能的解決方案中的任何一個。對於如此常見且簡單的使用情況,它們看起來都相當冗長。

我在這裡找到了一個小討論:https://github.com/rackt/redux/issues/815 但我沒有得到我需要的答案。