使用 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)
这是我不正确的地方。
在使用 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)