在文档中,Dan没有给出改变分派传递到中间件的方式的太多理由。他只是说:
但是还有一种不同的方法来启用链接。中间件是否可以接受next()分派函数作为参数而不是从存储实例中读取。
这是什么原因?对我来说,现在applyMiddleware
内部的代码将使用store和dispatch的两个参数,而不仅仅是store,这看起来更奇怪了。
看起来奇怪不是问题。
const logger = store => next => action => {
console.log('dispatching', action)
let result = next(action)
console.log('next state', store.getState())
return result
}
请注意,函数式语言默认使用这种格式,在那里它是完全正常的。
这样做的原因是因为猴子补丁还没有成为一种推荐的编程方法。将next
传递给函数更加灵活,并且不需要调用函数(开发人员的函数)的任何内容,从而减少了开发人员的负担并降低了出错的机会。
最后,Dan喜欢解释他为什么用某种方式编码,但是作为lib用户,我们这些低级的开发人员并不是决策者。我们已经做出了决定,这就是在Redux中使用中间件的方式。您可以随时分叉Redux并根据自己的喜好修改它,但请注意,Redux的强大之处不在于库中的代码,而在于第三方开发人员附加到它上面的代码。如果你不配合,你就会放弃所有的权力。
这是一个经常被问到的问题,我将很快把它添加到Redux常见问题解答中。
简短的回答是Redux深受函数式编程原则的影响,而柯里化是Dan和Andrew在做初始设计时碰巧选择的方法。一旦选择了它,它基本上就会保持这种方式以保持兼容性。
原始设计在Redux第55期中讨论过,Dan提出重写,然后在第1744期中拒绝了他自己的建议。