我在理解reducer和中间件之间的应用程序差异时遇到了一些麻烦。许多网站都描述了中间件甚至给出了精确的定义:
它在调度操作和到达reducer的那一刻之间提供了第三方扩展点。
或者:
中间件是通过编写功能来创建的,这些功能包含了不属于主要执行任务的单独的横切关注点。
但是从这些我理解的是,是的区别,而不是是什么。根据我的判断,不同之处在于,一个人采取行动并将该行动传递给另一个人,另一个采取行动和状态,并且"将状态传递给"。但您仍然可以访问midddleware中的商店。因此,存储和操作都要经过中间件,然后是减速器。因此减速器可以执行记录。
虽然日志记录似乎是中间件的一个明显的应用程序,但是有更多模糊的例子。例如,将一些简单的身份验证写入模块,您可以使用中间件函数来执行用户发送的操作并确定其身份验证级别:
import { getAuthLevel } from './auth';
export default store => next => action => {
return next({...action, auth: getAuthLevel(action.clientId)});
}
你可能有很多这样的用户:
{
users: [{
clientId: 'bobsUnqiueClientId',
user: 'Bob',
password: 'ilikecats',
authlevel: 'OVERLORD'
}, {
clientId: 'anotherUniqueClientId',
user: 'Alice',
password: 'boblikescats',
authlevel: 'MINION'
}]}
然后,您可能拥有与不同身份验证级别相对应的操作。您可以使用中间件进行映射,但是您需要了解有关所执行操作的更多具体细节,而且似乎更多与执行相关的"码。但是,它并不需要了解有关国家的任何事情。它只需要决定将哪些动作转发给减速器。
所以?这样的代码会用于reducer还是中间件?任何人都可以提供其他具体的例子来澄清两者之间的区别吗?
答案 0 :(得分:9)
reducer 是一个函数,它将您的状态的某些部分和当前调度的操作作为参数,并返回更新的状态。可以将多个reducer函数组合在一起,形成传递给createStore()
的 root reducer 函数。减速器假设是"纯函数",没有"副作用"。这意味着没有AJAX调用,没有调度操作,并且(理论上)没有记录 - 仅(state, action) => newState
。 (现在,你可以登录一个reducer,并且该代码可以正常工作,但作为一个原则问题仍然不是一个reducer是所谓的要做。)
中间件是包含商店dispatch
功能的一段代码。可以通过applyMiddleware()
增强器将多个中间件转换为管道。调度操作时,它将依次通过管道中的每个中间件。每个中间件都可以通过操作执行任何操作:记录,延迟,修改,调度其他内容,或者只是将其传递到管道中。最后,最后一个中间件将操作传递给实际的store.dispatch()
函数,该函数调用根减速器并启动状态更新逻辑。
所以是的,通常,中间件提供了一个执行与操作相关的集中逻辑的地方,例如授权检查或记录。
您可能需要阅读Redux文档中的Structuring Reducers部分,了解有关Reducer工作方式和组织方式的更多示例,我的React/Redux links list部分文章讨论了Redux middleware和{ {3}}