【问题标题】:ImmutableJS map to javascript objectImmutableJS 映射到 javascript 对象
【发布时间】: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())
  • 我不确定我是否理解。集合是指列表和数组。你能澄清一下你所说的收藏是什么意思吗

标签: reactjs redux immutability immutable.js


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    相关资源
    最近更新 更多