使用 redux 时 immutable.js 有什么用?

What is the use of immutable.js while using redux?

这是我不正确的地方。

在使用 redux 时,在 reducer 中我们使用展开运算符。

例如

{...state,data : action.payload,fetching:false}

那是创建了一个新的状态对象,而不是改变正确的状态,对吧? (如有错误请指正)

在这种情况下,immutableJS 有什么用?? 它执行与上面提到的相同的操作吗??

你是对的,你展示的例子是创建一个新对象而不是改变状态。它在很多情况下都很好,所以如果你觉得 ImmutableJS 不会为你添加任何东西,请不要使用它。

ImmutableJS 在扩展运算符在 ES6 中被普遍使用之前更有用(我相信它在技术上 still only a proposal). If you are not using ES6, then the alternative is to use Object.assign 会变得非常混乱,很快,特别是有更多的嵌套结构。

如果您需要修改状态树深处的单个节点,ImmutableJS 仍然有用,但如果是这种情况,您通常可以通过以不同方式构建数据来解决它。

使您的状态不可变可确保您的状态不会在 flux-flow 之外被修改。在非常复杂的结构中,有很多关卡和道具在它周围传递,它可以防止状态被意外改变。

当你有一个简单的平面状态时,你可以轻松地管理它而无需额外的库。

但是让我们考虑一些更复杂的事情,如下所示

{
  users: {
     123: {
       name: 'John',
       lastName: 'Doe'
     },
     345: {
       name: 'Bob',
       lastName: 'Jack'
     }
     ....
  }
}

如果你想为某个用户更新一个名字,那就不是那么简单了

return {  
  ...state,
  users: {
    ...state.users,
    [action.userId]: {
       ...state.users[action.userId],
       name: action.newName
    }
  }

很多代码,不是吗?此时,您可能想寻找另一种解决方案,immutable.js 可能会帮助您用一行来做同样的事情:

state.setIn(['users', action.userId, 'name'], action.newName)