当您的状态为标准/平展时访问对象列表

时间:2018-07-16 17:38:57

标签: reactjs redux react-redux

Redux建议您按照以下方式保持状态:https://redux.js.org/recipes/structuring-reducers/normalizing-state-shape

所以说我的状态是这样的:

      document.getElementById("s1").value = WhateverVariable

播放列表对象示例如下:

{
    selectedPlaylistIndex: 0,
    pageDict: {},
    playlistDict: {},
    playlistList: []  // holds IDs from playlistDict
}

如果要声明创建一个容器来显示播放列表对象的“ pageList”,则将播放列表的“ pageList”属性作为完整页面对象(而不是ID)的列表传递。我感觉这是一个昂贵的操作,因为pageDict,playlistDict,playlistList或selectedPlaylistIndex会随时更新,它将被渲染并且函数将运行。

是否有更优雅/更好的方法?我觉得我想念什么。

{
    id: someId,
    active: false,
    pageList: [], // holds IDs from pageDict
}

1 个答案:

答案 0 :(得分:1)

概括,您要问如何处理关系数据

上次我不得不处理集成了redux-orm库的关系数据。这是在Redux存储中管理关系数据的小型且不变的ORM。

因此,假设您的业务逻辑如下 1个播放列表中有很多页面,然后为了获取所选播放列表的页面(按播放列表的ID),将使用{{1 }},如下所示:

redux-orm

调用const getSelectedPlaylistId = state => state.application.selectedPlaylistIndex const getPlaylistPages = createSelector( orm, getSelectedPlaylistId, ({ Playlist }, playlistId) => { return Playlist.withId(playlistId).Pages.all().toRefArray(); } ); 后,仅当其中一种访问的模型发生更改时,结果才会被缓存并重新计算。

此外,如果您不想使用getPlaylistPages(假设您的应用没有太多模型或任何其他原因),则只需使用reselect库,缓存性能成本计算。

正如我已经提到的,我有这样的经历,我的想法和结论总结在以下SO问题中:How to deal with relational data in Redux?