为什么减速器必须返回新状态?

时间:2019-03-14 08:24:11

标签: redux

为什么reducer必须返回新状态,原因是什么?为什么我们不能返回更新后的状态?是我们必须遵循的模式还是什么?还请让我知道ngrx和redux完全不同吗?

3 个答案:

答案 0 :(得分:0)

在两个库中,它们都返回新修改的状态或原始状态

只需查看NgRX reducerRedux reducer的官方文档

NGRX Reducer

  

NgRx中的还原器负责处理应用程序中从一个状态到下一个状态的转换。

     

Reducer函数是纯函数,因为它们为给定的输入产生相同的输出。它们没有副作用,可以同步处理每个状态转换。每个化简函数都将获取调度的最新Action(当前状态),并确定是返回新修改的状态还是原始状态

Redux Reducer

  

Reducers指定应用程序的状态如何响应发送到商店的操作而改变。

无论状态管理模式如何,您都需要通过reducer更改状态,因为操作是商店的负责fpr信息源。它们是与NgRx和'redux'以及Vuex中的存储进行交互的入口点。

根据状态管理库的实现,我想它们都遵循Actions,Reducer的相同原理来更新状态异步。可能有些可能具有不同的功能。

希望这会有所帮助!

答案 1 :(得分:0)

两个库都旨在管理仅以特定的预定义方式进行操作的状态。减速器是他们提供给州的访问权限。

通过限制直接操纵状态的能力,它们使人们更容易理解如何达到特定状态。始终可以通过再次分派相同的动作来达到特定状态,并且只能通过分派给该状态的动作来达到给定状态(至少,这是理想的-不纯*减速器可能导致不同的状态状态是通过相同操作达到的。)

如果我们想象一个状态管理器允许函数操作状态,这是返回原始状态的变异版本所需要的,那么理解给定状态的实现将更加困难,因为存储可以通过任何功能在任何时候进行操作。

This article很好地概述了redux背后的关键思想,并解释了为什么做redux的工作。这是您问题的相关部分:


状态为只读

改变状态的唯一方法是发出一个动作,一个描述发生了什么的对象。

这确保了视图和网络回调都不会直接写入状态。相反,他们表达了改变国家的意图。因为所有更改都是集中的,并且严格按照顺序进行,所以没有任何微妙的竞争条件值得关注。由于动作只是简单的对象,因此可以将它们记录,序列化,存储并在以后重播,以进行调试或测试。


更改是通过纯函数进行的

要指定动作如何改变状态树,您可以编写纯约简器。

Reducer只是纯函数,它们采用上一个状态和一个动作,然后返回下一个状态。记住要返回新的状态对象,而不是改变先前的状态。您可以从单个化简器开始,随着应用程序的扩展,将其拆分为较小的化简器,用于管理状态树的特定部分。因为reducer只是函数,所以您可以控制它们的调用顺序,传递其他数据,甚至可以使可重复使用的reducer用于诸如分页之类的常见任务。


我对ngrx的经验要少得多,尽管它看起来像是一家受redux启发的商店,但我认为它大致遵循相同的原则。很高兴被证明是错误的,在这种情况下,我可以更新此答案。


*不纯函数可能会执行以下一项或多项操作:

  1. 访问状态(传递的参数除外)
  2. 操纵它传递的参数
  3. 具有副作用-会影响自身外部状态的事物

答案 2 :(得分:0)

我认为因为视图层需要比较当前状态和先前状态,所以它们应该是不同的对象。此外,它还可以支持其他功能,例如调试,时间旅行。