当前位置: 首页 > news >正文

redux 中间件原理

Redux 中间件(middleware)是 Redux 提供的一套 对 dispatch 进行增强 的机制。
它允许你在 action 被发出(dispatch)之后,到达 reducer 之前,插入你自己的逻辑。

比如:

  • 日志打印(redux-logger)

  • 处理异步(redux-thunk / redux-saga)

  • 接口请求

  • 权限判断

  • crash 处理

  • 重试机制

要理解中间件原理,只需要搞懂一句话:

核心一句话

Redux 中间件就是对 store.dispatch 的一层层包装(增强),形成类似 Koa 的洋葱模型。

一图快速理解 redux middleware 原理

action → dispatch → [middlewares...] → reducer → new state

每个中间件都能:

  • 拦截 action

  • 处理逻辑

  • 决定是否继续执行下一个中间件

  • 决定是否修改 action

  • 决定是否阻断 action

形成一个链式调用。

Redux 中间件的三层函数结构(重点)

所有中间件的签名长这样:

const middleware = store => next => action => {// ...你的逻辑
}

每层意义:

第一层:拿到 store
store => ...

能访问:

  • store.getState

  • store.dispatch(注意是未增强的 dispatch)

第二层:next
next => ...

next 就是:

下一个中间件的 dispatch(或者最终的 store.dispatch)

意味着:

  • 调用 next(action) 才会继续后面的中间件

  • 不调用 next 就会阻断后续流程(比如 redux-saga)

第三层:action
action => { ... }

最核心的一层,用来写你的逻辑。

中间件链是如何组成的(applyMiddleware 的核心原理)

Redux 的 applyMiddleware 会把你传入的中间件组合成一个链。

简化版源码(核心逻辑):

function applyMiddleware(...middlewares) {return createStore => (...args) => {const store = createStore(...args)let dispatch = store.dispatchconst middlewareAPI = {getState: store.getState,dispatch: (action) => dispatch(action)}const chain = middlewares.map(mw => mw(middlewareAPI))// 洋葱模型组合dispatch = compose(...chain)(store.dispatch)return {...store,dispatch}}
}

核心点:

  1. 对每个 middleware 调用第一层,得到第二层函数

  2. 使用 compose 做链式包装(从右向左)

  3. 得到被增强后的 dispatch

最终:

dispatch = mw1(mwAPI)(mw2(mwAPI)(mw3(mwAPI)(store.dispatch)))

这样每个中间件都像一次洋葱剥皮。

洋葱模型结构(middleware 调用流程)

以 3 个中间件举例:

dispatch(action)|↓
【middleware1】--→  next(action)|↓【middleware2】--→ next(action)|↓【middleware3】--→ next(action)|↓reducer

这与 Koa 的 middleware 机制一模一样。

看一个最小的中间件例子

日志中间件:
const logger = store => next => action => {console.log('prev state', store.getState());console.log('action', action);const result = next(action);console.log('next state', store.getState());return result;
};

由于 next 继续执行后续逻辑,你便能打印前后状态 → 实现日志。

再看一个实现异步的中间件(redux-thunk)

const thunk = store => next => action => {if (typeof action === 'function') {return action(store.dispatch, store.getState);}return next(action);
}

如果 action 是函数:

dispatch((dispatch, getState) => {// 异步操作dispatch({ type: 'done' })
})

就能写异步逻辑,这就是 redux-thunk 的原理。

再看一个阻断式的中间件(权限控制)

const authCheck = store => next => action => {if (!store.getState().user.loggedIn) {return console.warn("Not logged in");}return next(action);
};

不调用 next,则 action 不会继续传下去。

最终总结(面试回答)

Redux middleware 是对 store.dispatch 的函数式增强,它具有三层函数结构:store => next => action => result。Redux 利用 applyMiddleware 将多个中间件组合成链(洋葱模型),每个中间件都能拦截、修改、延迟、阻断 action,从而实现日志记录、异步处理、权限控制等功能。

http://www.gsyq.cn/news/78624.html

相关文章:

  • 2025年12月浩金樽酒业解读红酒回收核心价值逻辑:产区、时间与品质的三重赋能
  • 2025年新疆大马力拖拉机公司权威推荐榜单:新疆拖拉机/凯尔农机3004/大马力拖拉机源头公司精选
  • 【IEEE出版 | EI检索】第二届图像处理、多媒体技术与机器学习国际学术会议(IPMML 2025)
  • 2025 年 12 月钣金加工厂家最新推荐,聚焦高端定制需求与全案交付能力
  • 3U VPX板卡设计原理图:基于RFSOC的8路5G ADC和8路9G的DAC 3U VPX卡
  • 靠谱的轨道式座椅电梯厂家TOP5权威推荐:甄选专业品牌守护长
  • 2025年环保的全屋定制厂商推荐,实现绿色环保家居生活
  • 2025年度微动开关制造商综合实力排行,汽车微动开关/大电流微动开关/小型微动开关/防水微动开关/新能源微动开关供货商怎么选
  • 2025年闭式冷却塔厂家权威推荐榜单:封闭式凉水塔‌/复合式冷却塔‌/封闭的冷却塔‌‌源头厂家精选
  • 2025年优质乳胶床垫定制厂家有哪些?主要有哪些市场优势?
  • 2025农村饮用水一体化净水设备核心性能深度评测报告
  • 2025 年 12 月局放在线检测,变频电缆局放在线检测,高压电机局放检测厂家最新推荐,聚焦资质、案例、售后的十家机构深度解读!
  • 怎样确定不同品牌的示波器和探头的兼容性?
  • 2025年常州岩棉隔断十大品牌推荐:医院岩棉隔断哪家品质好
  • 2025年折弯机上下模高评价厂家推荐榜
  • 2025工会活动组织公司TOP5权威推荐:甄选口碑服务商,解
  • 禅道添加产品
  • AI重构客户管理全链路 纷享销客ShareAI定义智能CRM新范式
  • [译] AI 应该只以我们能够跟上的速度运行
  • 告别繁琐!MapStruct-Plus 让对象映射效率飙升,这波操作太香了!
  • 禅道的产品研发
  • 对象存储s5cmd常用命令
  • 2025年长三角泡沫混凝土企业TOP5推荐:高强度发泡混凝土
  • 2025年无压痕折弯机模具用户好评排行
  • 【中间件:Redis】2、单线程Redis高并发原理:I/O多路复用+3大优化点(附多线程对比) - 详解
  • 2025年宁波厂房装修公司综合排名及解析,看哪家实力强
  • 2025年跨境电商服务商权威推荐榜单:东南亚跨境电商/海外电商/电商开店培训服务商精选
  • 2025年度中国抖音外卖服务商TOP5推荐:斯创全域外卖的售
  • 阁下 AI 多模型协同能力全解析
  • 2025年质量好的真空净油机电加热器厂家最新用户好评榜