redux - 不可变 JS - 合并从数组创建 map 对象列表

标签 redux react-redux immutable.js

我正在使用 redux 和 immutablejs,我正在尝试创建一个 reducer 函数。

我遇到了一些我没想到的行为

const a = new Immutable.Map({
  numbers: [{id: 1},{id: 2}]
});

const b = a.merge(
  {
    numbers: [{id: 4},{id: 5}]
  }
);

这里是ab的值

a.get("numbers");
[Object, Object]
b.get("numbers");
List {size: 2, _origin: 0, _capacity: 2, _level: 5, _root: null…}
b.get("numbers").get(0);
Map {size: 1, _root: ArrayMapNode, __ownerID: undefined, __hash: undefined, __altered: false} 

我没想到 numbers 是一个不可变的 Map 对象列表。

在我的应用程序中,使用 redux,我将初始状态设置为:

const initialState = new Immutable.Map({
  error: null,
  isBusy: false,
  films: []
});

我是 reducer,当我获取电影时,我尝试按如下方式合并它们:

return state.merge({
        isBusy: false,
        films: action.payload,
        error: null
      });

这会导致 React 组件出现问题,因为 films 最初是一个对象数组,然后它们变成了一个不可变的 map 列表。

我应该创建不同的初始状态,还是应该使用不同类型的合并?还是别的?

谢谢

最佳答案

我认为你要做的不是合并整个 map 对象,至少不应该在你说的情况下,它应该是 update + ( concat合并):

const a = new Immutable.Map({
  numbers: [{id: 1},{id: 2}]
});

const b = a.update("numbers", numbers =>
  numbers.concat([{id: 4},{id: 5}])
  // or
  numbers.merge([{id: 4},{id: 5}])
);

通过在您的代码中进行合并,由于“合并”的性质,您将覆盖现有代码,因为合并中的键是相同的; “数字”。

关于redux - 不可变 JS - 合并从数组创建 map 对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39294653/

相关文章:

javascript - mapDispatchToProps 应该分派(dispatch)初始化操作吗?

immutable.js - Immutable JS - 将列表转换为 map

javascript - redux 的一般用法

reactjs - 使用 redux-form,如何重置另一个组件的表单值?

css - ReactJS 不根据表达式设置类

javascript - 在 React 中使用不可变状态有什么缺点?

javascript - immutable.js 可以与服务器上的 redis 互换吗?

javascript - useEffect inside material ui 选项卡隐藏第三个选项卡

循环遍历类型的 Typescript 语法——let type Types = typeof myObject[number]

reactjs - 使用 Fetch API 和 cross-fetch polyfill 在文件输入更改时上传文件