ImmutableJS 映射到 javascript 对象

Posted

技术标签:

【中文标题】ImmutableJS 映射到 javascript 对象【英文标题】:ImmutableJS map to javascript object 【发布时间】:2020-01-23 02:56:37 【问题描述】:

我有一个这样的 redux 状态:

const state = fromJS(
books: 
    "book1": 
        "name": "name1"
    ,
    "book2": 
        "name": "name2"
    ,
    "book3": 
        "name": "name2"
    

);

我正在尝试创建一个选择器,它可以为我提供 JS 对象形式的书籍集合。

export const booksSelector = state => state.get('books');

我将这个选择器用作:

const mapStateToProps = state => (
  books: booksSelector(state),
);

但它返回 Map - 我已经检查过文档和其他放置的文件,我不应该在这里做任何 toJS()。有什么方法可以创建一个合适的选择器,该选择器实际上可以将该映射转换为一个对象?我有很多可以使用 booksSelector 的组件,似乎我可能不得不在每个组件中附加 books.toJS(),这有点奇怪。重新选择库并没有太大帮助。

【问题讨论】:

this 有帮助吗? 不是真的 - 他们每个人都在他们的组件中使用地图,我想避免这种情况,因为我有大量的组件要更新(不仅仅是渲染函数,所有其他函数也会有使用 .map 或 .toJS()) 我不确定我是否理解。集合是指列表和数组。你能澄清一下你所说的收藏是什么意思吗 【参考方案1】:

如果你想将该 Map 转换为 JS 对象,那么唯一的方法是toJS()。您可以将其转换为集合 (Immutable Lists),然后将其传递给每个组件。您可以使用不可变 API 列表函数进行各种处理。

export const booksSelector = state => state.get('books').toList();

我觉得将 Immutable 对象转换为 JS 对象不是一个好主意。它是某种反模式,因为那些不可变对象指的是原始状态。因此,如果您将这些不可变类型转换为组件中的 JS 对象,则意味着您可以从组件中改变状态,这显然不是一件好事。

【讨论】:

以上是关于ImmutableJS 映射到 javascript 对象的主要内容,如果未能解决你的问题,请参考以下文章

javascript ImmutableJS例子

如何正确传递 immutablejs 对象

immutablejs 是不是允许使用引用类型进行搜索

combineReducers 破坏 Redux 状态并破坏多个 ImmutableJs 减速器

在不丢失引用的情况下更新 ImmutableJS OrderedMap 上的记录

[Immutable.js] Updating nested values with ImmutableJS