redux中的Middleware

1. 什么是middlewware

  • 是dispatch分发action和action到达reducer的中间件

2. 为什么要用middleware

一般我们使用 action——dispatcher——reducers 时同步情况很好,但是如果需要异步的情况就不是很好了。我们希望可以先去服务器请求数据,在渲染界面,或者是希望可以进行异步的操作

仅仅只修改dispatch和reducer就不能满足,所以需要加上中间件,原因如下所示:

  • reducer 更关心的是数据的转化逻辑
  • redux 借鉴了 koa 里中间件的思想
  • redux 的 middleware 是为了增强 dispatch 而出现
  • 同步异步
    • 同步操作只要发出一种 Action 即可
    • Redux 本身不处理异步行为,需要依赖中间件。结合 redux-actions 使用,Redux 有两个推荐的异步中间件:redux-thunk redux-promise
      后期会继续更新~

3. 如何使用

基本格式如下:
next表示下一个中间件store和action不进行任何的动作

store => next => action => {
   ...
}

举个例子:

export default store=>next=>action=> {
    if (action.type === 'LOGIN_USER') {
        request.post('/login')
            .send({name: action.text.name, password: action.text.password})
            .end((err, res)=> {
                console.log("login:",res.body)
                next({type: "CHECK_USER", checkUser: res.body});
            })
    } else {
        next(action);    //下一个中间件
    }
}

4. 详解

redux 提供了 applyMiddleware 这个 api 来加载 middleware

import compose from './compose'
export default function applyMiddleware(...middlewares) {
  return (createStore) => (reducer, initialState, enhancer) => {
    var store = createStore(reducer, initialState, enhancer)
    var dispatch = store.dispatch
    var chain = []
    var middlewareAPI = {
      getState: store.getState,
      dispatch: (action) => dispatch(action)
    }
    chain = middlewares.map(middleware => middleware(middlewareAPI))
    dispatch = compose(...chain)(store.dispatch)
    return {
      ...store,
      dispatch
    }
  }
}
  • applyMiddleware:接收原来的creatStore做参数,返回一个应用了middleware的增强后的creatStore(...store,dispatch)

  • middlewareAPI:每个 middleware 都可以访问 store,即 middlewareAPI 这个变量,所以就可以拿到 store 的 dispatch 方法

  • chain:是一个数组,假设chain为[m1, m2, m3],经过compose后,dispatch为m1(m2(m3(store.dispatch)))

  • compose:是函数式编程中的组合,compose 将 chain 中的所有匿名函数,[f1, f2, ... , fx, ..., fn],组装成一个新的函数,即新的 dispatch

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 为什么需要middleware 在没有middleware之前,Redux的工作流程是这样的 理解middlewa...
    杨慧莉阅读 841评论 0 0
  • 为什么dispatch需要middleware 上图表达的是 redux 中一个简单的同步数据流动的场景,点击 b...
    一个胖子的我阅读 2,009评论 1 9
  • 学习必备要点: 首先弄明白,Redux在使用React开发应用时,起到什么作用——状态集中管理 弄清楚Redux是...
    贺贺v5阅读 8,957评论 10 58
  • 前言 本文 有配套视频,可以酌情观看。 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我讨论。 文中所有内...
    珍此良辰阅读 11,955评论 23 111
  • 写给正年少的阿弟: 嘿,你老实说,在看这之前,是不是又在看哆来A梦了?或者 熊出没 吗?咦,别急着指责我公众揭露你...
    北海有大大鱼阅读 482评论 0 1