减速机和中间件有什么区别?

Dru*_*les 10 middleware node.js reactjs redux react-redux

我在理解reducer和中间件之间的应用程序差异时遇到了一些麻烦.许多网站描述了中间件甚至给出了精确的定义:

它在调度操作和到达reducer之间提供了第三方扩展点.

要么:

中间件是通过组合功能来创建的,这些功能包含了不属于主要执行任务的单独的横切关注点.

但是,从这些我都明白的是,有有差别,只是没有什么.根据我的判断,不同之处在于,一个人采取行动并将该行动传递给另一个人,另一个采取行动和状态,并"通过国家".但您仍然可以访问midddleware中的商店.因此,存储和操作都要经过中间件,然后是减速器.因此减速器可以执行日志记录.

虽然日志记录似乎是中间件的一个显而易见的应用程序,但有更多含糊不清的例子.例如,将一些简单的身份验证写入模块,您可以使用中间件函数来执行用户发送的操作并确定其身份验证级别:

import { getAuthLevel } from './auth';

export default store => next => action => {
  return next({...action, auth: getAuthLevel(action.clientId)});
}
Run Code Online (Sandbox Code Playgroud)

你可能有很多像这样的用户:

{
users: [{
  clientId: 'bobsUnqiueClientId',
  user: 'Bob',
  password: 'ilikecats',
  authlevel: 'OVERLORD'
}, {
  clientId: 'anotherUniqueClientId',
  user: 'Alice',
  password: 'boblikescats',
  authlevel: 'MINION'
}]}
Run Code Online (Sandbox Code Playgroud)

然后,您可能拥有与不同身份验证级别相对应的操作.您可以使用中间件映射,但是您需要了解有关正在执行的操作的更多具体细节,它似乎更像是"与执行相关"的代码.但是,它不需要了解有关国家的任何信息.它只需要决定将哪些动作转发给减速器.

所以?这样的代码会用于reducer还是中间件?任何人都可以提供其他具体的例子来澄清两者之间的区别吗?

mar*_*son 12

一个减速器是一个函数,你的国家的某些部分和当前派遣行动的参数,并返回一个更新的状态.可以将多个reducer函数组合在一起以形成传递给的根reducer函数createStore().减速器应该是"纯粹的功能",没有"副作用".这意味着没有AJAX调用,没有调度操作,并且(理论上)没有日志记录 - 只是(state, action) => newState.(现在,您可以登录reducer,并且该代码可以正常工作,但作为一个原则问题,仍然不是减速器应该做的事情.)

一个中间件是一段代码,在店内的包装dispatch功能.多个中间件可以通过applyMiddleware()增强器转换为管道.调度操作时,它将依次通过管道中的每个中间件.每个中间件都可以通过操作执行任何操作:记录,延迟,修改,调度其他内容,或者只是将其传递到管道中.最后,最后一个中间件将操作传递给实际store.dispatch()函数,该函数调用root reducer并启动状态更新逻辑.

所以是的,通常,中间件提供了执行与操作相关的集中逻辑的位置,例如授权检查或日志记录.

您可能需要阅读Redux文档中的Structuring Reducers部分,以获取有关reducers如何工作和组织的更多示例,我的React/Redux链接列表包含讨论Redux中间件reducer使用的文章部分.