【发布时间】:2017-03-28 17:23:57
【问题描述】:
在学习Redux 的过程中,我遇到了Reducers。文档指出:
reducer 是一个纯函数,它接受前一个状态和一个动作,并返回下一个状态。 (previousState, action) => newState.它被称为 reducer,因为它是您将传递给 Array.prototype.reduce(reducer, ?initialValue) 的函数类型。
MDN 将reduce 方法描述为:
reduce() 方法对累加器和数组的每个值(从左到右)应用一个函数以将其减少为单个值。
我仍然对为什么 Redux 对 reducer 的定义感到困惑,因为它没有任何意义。其次,MDN 的描述似乎也不正确。 reduce 方法并不总是用于减少到单个值。它可以用来代替map 和filter,并且在代替链接时实际上更快。
MDN 描述不正确吗?
回到 Redux 的 reducer 定义,它声明:
之所以称为reducer,是因为它是您要传递给Array.prototype.reduce(reducer, ?initialValue)的函数类型
我的印象是 Redux 中的 reducer 负责修改状态。一个reducer示例:
const count = function(state, action) {
if(action.type == 'INCREMENT') {
return state + 1;
} else if(action.type == 'DECREMENT') {
return state - 1;
} else {
return state;
}
}
...我不明白这是如何传递给reduce 的函数。这些数据是如何减少到单个值的?如果这是一个您将传递给reduce 的函数,那么state 将是回调,action 将是初始值。
感谢任何清晰的解释。很难概念化。
【问题讨论】:
-
好问题!
-
对我来说,来自 WPF 和 C#,动作似乎是“setter”动作,reducers 是“getter”动作。虽然实际上并没有以这种方式在后台运行,因为它返回一个全新的状态对象而不是更改它,但最终结果与它所完成的相似。
-
作为一名在 Java、.NET、Android、Angular、PHP 和其他堆栈方面拥有超过 15 年经验的开发人员,我可以肯定地说,redux 中的命名对于开发社区来说简直是一种耻辱. Redux 开发人员应该为自己混淆了几代开发人员而感到羞耻。
-
关于您对 MDN 定义的挑战,您能否提供一个
reducer不返回单个值的示例?请记住,数组仍然是单个值。当然reduce可以用来代替map/filter,但不同之处在于您使用一个值(累加器)而不是单独对每个元素进行操作。 -
关于第二段到最后一段,整个 reducer 函数作为“reducer”传递 - “初始值”是一个单独的参数。
标签: javascript reactjs redux functional-programming