Redux:为什么国家职能被称为reducer?
来自官方文档的部分:
它被称为reducer,因为它是传递给Array.prototype.reduce(reducer,?initialValue)的函数的types。
对我来说没有什么意义。 有人可以向我解释为什么他们实际上被称为减速器? 事实上,他们返回一个默认值(或他们有一个默认的参数值)不会使他们减less恕我直言。
事实上,他们返回一个默认值(或他们有一个默认的参数值)不会使他们减less恕我直言。
减速器不只是返回默认值。 他们总是返回国家的积累(根据所有以前和当前的行动)。
因此,他们作为国家的还原者。 每次调用redux reducer时,都会通过action (state, action)
。 然后基于该动作减less (或累积)该状态,然后返回下一个状态。 这是经典fold
或reduce
function的一个循环。
作为@azium总结了state -> action -> state
。
如果您将应用程序中的一系列操作看作是一个列表,或者更像一个stream,则可能更有意义。
以这个人为的例子:
['apple', 'banana', 'cherry'].reduce((acc, item) => acc + item.length, 0)
第一个参数是forms(Int, String) => Int
的函数。 随着初始值,你通过reduce
可以称为“减速function”,你会得到处理该系列项目的结果。 所以你可能会说,reducer函数描述了每个连续的单个项目做了什么来改变结果。 换句话说,reducer函数取先前的输出和下一个值,然后计算下一个输出。
这与Redux Reducer所做的相似:它采用之前的状态和当前的操作,并计算下一个状态。
在真正的函数式编程风格中,可以从概念上消除应用于参数和结果的含义,只关注input和输出的“形状”。
在实践中,Redux reducer通常是正交的,对于一个给定的动作,它们并不都对相同的属性进行修改,这样就很容易分割他们的职责,并用combineReducers
聚合输出。
如前所述,这个名字与函数式编程中的reducer概念有关。 您也可能会发现减速器的Merriam-Webster字典定义有帮助:
1A。 合并或导致汇合:合并(将所有问题归结为一个)
Reducer将动作合并为一个表示应用程序状态的单个对象。
我们知道Reducer来自哪里(函数式编程),为什么他们可能被认为正在减less工作(将n个input项减less到一个单一的返回值 – 这正是正常函数所要做的)。 但是:名字只是一个名字,就像玫瑰是玫瑰的名字。 不要想太多。 Redux程序员是IT人员,他们被locking在他们的背景下,这是有道理的。 我们其他人不得不接受发明人的权利,把一只黄色的猫叫做蓝色的狗;-)
作者认为国家作为减税function的累积者。 例如:
Final State = [Action1, Action2, ..., ActionN].reduce(reducer, Initial State);
reduce函数来自函数式编程,名字“reducer”也来自FP。
我不喜欢在这里使用这个名字。 因为行动之后,我不认为世界是一个单一的价值结果。 这里的状态是一个对象。 例如:
['eat', 'sleep'] === [addTodo('eat'), addTodo('sleep')].reduce(reducer, []);
这个减速器根本不会减less。 我不在乎它减less了什么。 将其命名为传感器将更有意义。
它被称为
reducer
的原因是因为你可以“减less”collection of actions
和一个initial state
(存储)来执行这些动作来得到final state
。
怎么样? 为了回答这个问题,让我再次定义一个reducer:
reduce()方法针对
accumulator
和数组的每个值(从左到右)应用一个function
,以将其减less为单个值。
减速机是做什么的?
reducer是一个纯
function
,它接受当前状态和一个动作,并返回下一个状态。 请注意,状态是在集合上的每个操作被应用来改变这个状态时accumulated
。
因此,给定一collection of actions
,Reducer将应用于集合的每个值(从左到右)。 第一次,它返回initial value
。 现在reducer再次应用在这个初始状态,第一个动作返回下一个状态。 然后每次在current state
next state
应用下一个集合项(action),以获得next state
直到到达数组的末尾。 然后,你会得到the final state
。 多么酷啊!