Redux中间件随笔

说到Redux中间件,我见到的他的应用,在一个高星项目中,是做数据的异步获取,后端接口调用的角色。我甚感此种方式的精明之处。在此写个文章,任诸君品鉴,若有不到之处,不吝赐教。

1.什么是中间件?既然叫了中间件,就有中间件的共性。Express中中间件,就是一个拦截的作用,每次的request,都会被所截获,然后做你想要做的目的。如果你想放行,就next();继续下个中间件。同理Redux中,request=>action,request变成了action。其他就是一样的。每个触发action都会被中间件所截获。根据你的需求在中间件里面做你想做的事。

2.如何实现这个截获?Redux中每个action,需要被dispatch,才能进入reducer里面去改变store里面的状态集。这意味着dispatch是入口点,你想实现这个截获就是改写dispatch。让dispach先执行一个一个的中间件,最后在触发这个action。

3.applyMiddleware是Redux提供的方法,他的作用就是实现上面所言改写dispatch,让他可以先执行中间件然后在触发action。

 1 export default function applyMiddleware(...middlewares) {
 2
 3   return (createStore) => (reducer, initialState, enhancer) => {
 4
 5     var store = createStore(reducer, initialState, enhancer)
 6     var dispatch = store.dispatch
 7     var chain = []
 8
 9     var middlewareAPI = {
10       getState: store.getState,
11       dispatch: (action) => dispatch(action)
12     }
13
14     chain = middlewares.map(middleware => middleware(middlewareAPI))
15
16     dispatch = compose(...chain)(store.dispatch)
17
18     return {
19       ...store,
20       dispatch
21     }
22   }
23 }

中间件有固定的写法如下:

1 function middleware({dispatch, getState}) {
2     return function(next) {
3         return function(action) {
4             next(ation);
5         }
6     }
7 }

第一步则把函数的第一层拆掉了,剩下的部分存入chain数组中。

第二步的compose就是改写dispatch函数了,compose源码如下。

export default function compose(...funcs) {
  return (...args) => {
    if (funcs.length === 0) {
      return args[0]
    }

    const last = funcs[funcs.length - 1]
    const rest = funcs.slice(0, -1)

    return rest.reduceRight((composed, f) => f(composed), last(...args))
  }
}

精华部分来临了,最后一个中间件的next为store.dispatch,然后的action=>{}这个函数将作为下一个next的参数,这样的话造成层层嵌套,dispatch函数就变成了按照中间的定义顺序执行了。最后当然返回一个action=>{}这样的函数。但是由于闭包的关系,这个返回的函数是一个可以想象为层层嵌套的结构。这个部分当然很有技巧,先反而后正,按照中间件的定义顺序执行,这个很有技巧的。

达成我们的目标dispath被改写,先执行中间件然后在触发action。中间件就是这样的了。

前端越来越往工程化走了,以往在后端的概念,越来越多用之于前端,这证明编程不分前后,工程化,规范化使我们程序更为合理,项目更好维护。

时间: 2024-12-15 09:47:05

Redux中间件随笔的相关文章

redux中间件

怎么自定义一个中间件呢? 根据 redux 文档,中间件的签名如下: ({ getState, dispatch }) => next => action 根据上文的 applyMiddleware 源码,每个中间件接收 getState & dispatch 作为参数,并返回一个函数,该函数会被传入下一个中间件的 dispatch 方法,并返回一个接收 action 的新函数. 以一个打印 dispatch action 前后的 state 为例,创建一个中间件示例: export

react+redux教程(七)自定义redux中间件

教程源代码及目录 https://github.com/lewis617/myReact 今天,我们要讲解的是自定义redux中间件这个知识点.本节内容非常抽象,特别是中间件的定义原理,那多层的函数嵌套和串联,需要极强逻辑思维能力才能完全消化吸收.不过我会多罗嗦几句,所以不用担心. 例子 例子是官方的例子real-world,做的是一个获取github用户.仓库的程序. 本例子源代码: https://github.com/lewis617/myReact/tree/master/redux-e

Redux:中间件

redux中间件概念 比较容易理解. 在使用redux时,改变store state的一个固定套路是调用store.dispatch(action)方法,将action送到reducer中. 所谓中间件,就是在dispatch发送action  和  action到达reducer  之间,加入一些中间层,对action进行处理. 在之前学习redux的异步操作时,用到的redux-thunk就是一个中间件.action抵达reducer之前先对其进行判断,如果是对象就直接送到reducer:如

redux中间件和redux-thunk实现原理

redux-thunk这个中间件可以使我们把这样的异步请求或者说复杂的逻辑可以放到action里面去处理,redux-thunk使redux的一个中间件,为什么叫做中间件 我们说中间件,那么肯定是谁和谁的中间,那么redux的中间件指的是谁和谁的中间呢? 如图.view在redux中会派发一个action,action通过store的dispatch方法派发给store,store接收到action,连同之前到state,一起传给reducer,reducer返回一个新到数据给store,sto

浅谈redux 中间件的原理

在使用redux管理异步数据流的时候,我们会使用中间件,以redux-thunk中间件为例,我们做一下分析: 首先是构建store,我们需要以下代码进行揉入中间件的类似creatStore函数的构造: const loggerMiddleware = createLogger(); const createStoreWithMiddleware = applyMiddleware( thunkMiddleware, loggerMiddleware )(createStore); export

redux中间件的原理——从懵逼到恍然大悟

前言react已经出来很久了,其生态圈之庞大,一锅炖不下!各种react-xx,已让我们不堪重负,github上随便一个demo,引入的模块至少都是五指之数+.看着头疼,嚼之无味…….在此建议新学者,可以从基础的核心模块学起,前期不要考虑那些数量繁多的马仔小弟,边学边写,个人感觉前期核心要学的流程大致如下:React ——> React + redux + React-redux ——> React + redux + React-redux + React-router ——> Rea

Redux 中间件和异步操作

回顾一下Redux的数据流转,用户点击按钮发送了一个action,  reducer 就根据action 和以前的state 计算出了新的state, store.subscribe 方法的回调函数中 store.getState() 获取新的state, 把state 注入到页面元素中,实现页面状态的更新.你发现根本就没有机会去做一个异步的操作,那怎么办? 现实世界中有大量的异步操作,那要用到Redux 的新的工具:中间件. 中间件,说白了,就是中间的部分,正常的流程中,先执行函数a,然后执行

理解redux中间件

redux questions : 1. reducers 函数如何创建和聚合 2. action创建函数如何如何包裹在dispatch函数中 3. 如何给默认的dispatch方法增加中间件能力 middleware: (js context)中间件由函数组合的形式创建,实现与主要执行任务正交的功能. tips:类似的有装饰器模式 在 redux middleware 要装饰的主要功能是 dispatch 函数.dispatch 函数的主要功能是发送actions 给 reducer函数来产生

Redux 中间件的执行顺序理解

Redux.applyMiddleware(thunk, middleware1) 和 Redux.applyMiddleware(middleware1, thunk) 的区别: <!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Redux<