为什么需要不可变状态用于redux

时间:2016-09-22 18:23:13

标签: redux immutable.js

我的状态在我的redux商店中的类型为Immutable.js,我只更改我的reducer中的状态。跳过使用不可变并且有一个解析器在命令上检查我的应用程序并且如果我在reducer函数之外更改我的商店会发出警告是否更有意义?或者有充分的理由说明为什么没有这样做?

3 个答案:

答案 0 :(得分:3)

如果您愿意,可以在减速器中改变您的状态。 Redux并没有强制要求你不要改变自己的状态,但它建议反对它。

React-Redux,它不是Redux,其设计假设状态永远不会发生变异。这使得它可以进行非常快速的检查,以确定状态层次结构中的任何位置是否发生了变化。

每次处理一个动作时,Redux本身都会触发一个事件,无论它是否修改(通过改变或替换)状态。它永远不会检查除undefined之外的状态。它并不关心你用它做什么。

不可变状态有许多好处,但Redux中使用的主要功能是检查修改速度很快。例如,你的"解析器"需要在每次运行时访问整个状态中每个对象和数组的每个属性和项目,以便做出有意义的决定。如果React-Redux做了同样的事情,那么它将非常缓慢,没有人会使用它。

因此,成千上万的开发人员正在限制自己的不可动摇性,因为它具有超越学术界的真正优势。

答案 1 :(得分:3)

我认为你的某些类型的中间件能够检查无意中的状态突变的想法实际上是一个非常酷的想法。我不确定它的可行性/性能如何(它甚至可能已经存在,而我还没有听说过它)。但是,对于那些不使用某些类型的库(如Immutable.js或seamless-immutable)的人,我可以看到它是如何有用的。

我只是想澄清一下,Immutable.js强制要求你不要改变你的状态,而这只是因为你不可能从你的减压者之外改变你的状态。不可变性的一般编程概念与仅使用Reducer改变状态的Redux特定概念之间存在重要差异。 Immutable.js强制执行前者,从逻辑上也强制执行后者。

但是,Immutable.js确保您不会意外地改变状态这一事实并不是将该库用于Redux商店的唯一原因:

  • 性能:Immutable.js具有性能优化,允许它在实际共享内存中的相同底层对象时强制实现不变性。例如,这意味着您不能仅仅为了更改数组中的单个项目而执行大量数据的深层复制。这可能意味着在您的商店拥有大量数据和/或状态发生很多变化的情况下,内存占用量会显着缩小。
  • 帮助方法:虽然可以使用各种技术来避免变异状态,但Immutable.js有一个非常好的API。例如,如果您曾尝试更改深度嵌套在数组和/或对象中的内容,那么您会注意到使用本机JS执行此操作非常非常痛苦。 Immutable.js使您可以根据需要深入挖掘并更改某些内容并将这些内容链接在一起。

    return state
      .updateIn(['todos', '5', 'attachment'], attachment => attachment.set('name', 'foo'))
      .set('isProcessing', true)
      .updateIn(['other', 'nested', 'stuff'], stuff => stuff.set('bar', 'baz'));

话虽如此,它绝对是可选的。您已经有了上述无缝不可变的lodash-fp之类的替代方案,并且只是手动执行:

return Object.assign({}, state, { name: 'new name' });

为了比较,Immutable.js替代方案只是:

return state.set('name', 'new name');

答案 2 :(得分:1)

这个问题有几个方面:

  • Redux鼓励您为减速机编写纯函数。这样可以实现时间旅行调试等功能,并使其更易于测试。 "纯"意味着没有副作用,这意味着你不应该直接修改传入的任何数据。相反,数据更新应该是不可改变的(即通过复制你想要更新的数据部分)。
  • React-Redux的connect函数假定更新将以不可变的方式完成,并进行参考比较以查看传入数据是否已更改。如果对象引用与以前相同,则假定没有任何更改,并且不会导致组件重新呈现。

但请注意"不可变更新" 意味着您必须使用Immutable.js库。完全可以以不可变的方式更新普通的JS对象。

作为React/Redux links list的一部分,我有很多关于这些主题的有用文章的链接。请特别注意Immutable Data ManagementFunctional Programming的类别。我还有另一个页面列出了各种immutable data-related libraries,包括可以更容易更新普通JS数据的实用程序。最后,我列出了一些Redux-related dev tools的列表,其中包括一些工具,如果您不小心改变了您的状态,它们会发出警告。