【问题标题】:What is the use of immutable.js while using redux?使用 redux 时 immutable.js 有什么用?
【发布时间】:2017-02-21 09:57:23
【问题描述】:

这是我做错的事情。

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

例如

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

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

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

【问题讨论】:

    标签: reactjs redux immutability react-redux immutable.js


    【解决方案1】:

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

    在扩展运算符在 ES6 中普遍使用之前,ImmutableJS 更有用(我相信它在技术上是 still only a proposal)。如果您不使用 ES6,那么另一种方法是使用 Object.assign,它会变得非常混乱,非常快,尤其是在嵌套结构较多的情况下。

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

    【讨论】:

    • 是的,使用它有多种好处。我想说,如果你有一个规范化的数据结构,它就不会那么混乱,并且在那时,Immutable 失去了一个简单的 API 来进行更深层次的改变的一些好处,因为你不会有很深的树。然而,除此之外,我仍然相信 Immutable 会迫使您在所有数据更改中保持不变,并确保其他开发人员也必须这样做,同时使用方便的 API。我个人会推荐它
    • 是的,这很好。我坚信只有在有意义的情况下才使用库,所以如果代码库是共享的,那么在我看来,强制不变性将是使用它的合理理由。
    • “在这一点上,Immutable 失去了一些简单的 API 的好处,因为你不会有深层次的树”@Glitch100 你能详细说明一下吗?
    • 好吧,如果你标准化你的状态,你可能会得到一个更浅的状态树。请参阅:redux.js.org/docs/recipes/reducers/NormalizingStateShape.html除此之外,我仍然建议使用 Immutable,因为它迫使您以不可变的方式使用和思考
    【解决方案2】:

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

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

    {
      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)
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 2017-09-16
        • 2018-10-02
        • 1970-01-01
        • 2019-06-15
        • 2016-08-26
        • 1970-01-01
        相关资源
        最近更新 更多