• redux教程之源码解析3applyMiddleware(分析在注释中)


    applyMiddleware是另一个核心函数
    首先我们需要知道如何使用中间件
    eg:
    import { createStore, applyMiddleware } from 'redux'
    import todos from './reducers'
    
    function logger({ getState }) {
      return (next) => (action) => {
        console.log('will dispatch', action)
    
        // 调用 middleware 链中下一个 middleware 的 dispatch。
        let returnValue = next(action)
    
        console.log('state after dispatch', getState())
    
        // 一般会是 action 本身,除非
        // 后面的 middleware 修改了它。
        return returnValue
      }
    }
    
    let store = createStore(
      todos,
      [ 'Use Redux' ],
      applyMiddleware(logger)
    )
    
    store.dispatch({
      type: 'ADD_TODO',
      text: 'Understand the middleware'
    })
    
    
    
    
    
    中间件其实就是对reducer就行功能扩展,例如上面的例子,logger即在执行reducer时,输出正在执行的action名字
    const a = [()=>{console.log(1)},()=>{console.log(2)},()=>{console.log(3)},()=>{console.log(4)}]
    undefined
    const b = a.reduce((a, b) => (...args) => a(b(...args)))
    undefined
    b(1)
    VM8485:1 4
    VM8485:1 3
    VM8485:1 2
    VM8485:1 1
    undefined
    源码
    export default function applyMiddleware(...middlewares) {
      /**返回一个新的createStore函数 */
      return createStore => (...args) => {
        /**通过传入的reducer和action生成store */
        const store = createStore(...args)
        let dispatch = () => {
          throw new Error(
            `Dispatching while constructing your middleware is not allowed. ` +
              `Other middleware would not be applied to this dispatch.`
          )
        }
        /**对store和disptch改变成动态的,这样每次传入一个middleware的Store和disptch都是上一个middleware处理过的 */
        const middlewareAPI = {
          getState: store.getState,
          dispatch: (...args) => dispatch(...args)
        }
        const chain = middlewares.map(middleware => middleware(middlewareAPI))
        /**链式处理函数,即依次执行middleware数组中的各个中间件 */
        dispatch = compose(...chain)(store.dispatch)
    
        /**将所有中间件对reducer的扩展加入后,返回store和dispatch */
        return {
          ...store,
          dispatch
        }
      }
    }
  • 相关阅读:
    zbb20181205 springboot_aop
    zbb20181204 GIT RM -R --CACHED 去掉已经托管在GIT上的文件
    zbb20181129 eclipse查看jar乱码问题
    反编译
    zbb20181116 验证 map list 是否存在空 null 字段信息
    zbb20181109 git 服务器上的 Git
    zbb20181023 idea,IntelliJ中的main函数和System.out.println()快捷键
    zbb20181023 idea,IntelliJ IDEA 2017.3-2018.1 全系列汉化包
    struts2拦截器(四)
    struts2OGNL表达式(三)
  • 原文地址:https://www.cnblogs.com/qdcnbj/p/12687041.html
Copyright © 2020-2023  润新知