redux中间件

74 阅读1分钟

crateStore里面判断是否传入了applyMiddleWare,如果传入了就返回执行后的applyMiddleWare,里面传入createStore,reduce。内部执行creaStore(reduce)获取到state返回。 applyMiddleWare里面传入的中间件依次执行返回加强dispatch

compose

function f1(arg) {
  console.log("f1", arg);
  return arg;
}

function f2(arg) {
  console.log("f2", arg);
  return arg;
}

function f3(arg) {
  console.log("f3", arg);
  return arg;
}

function compose(...funs) {
  if (funs.length === 0) {
    return (arg) => arg;
  }
  if (funs.length === 1) {
    return funs[0];
  }
  return funs.reduce(
    (a, b) =>
      (arg) =>
        a(b(arg))
  );
}

const res = compose(f1, f2, f3)("omg");

applyMiddleware

先将函数本身当成参数传进去,再在enhancer里执行,这样就可以操作中间件 createStore(reduce,enhancer){ if(enhancer){ return enhancer(createStore)(reduce) } }

1.获取store,开始加强dipatch

export default function applyMiddleware(...middlewares){
    return (createStore) => {
        return (reducer) => {
            const store = createStore(reducer)
            return {
                ...store,
                //加强版dispatch
                dispatch
            }
        }
    }
}

2.因为异步的dispatch里面参数是个函数 (dispatch,getStore)=> {dispatch({type:''})}

            let dispatch = store.dispatch
            const middlAPI = {
                getState : store.getState,
                //中间件调用的加强版的不是原版的
                dispatch:(actions,...args) => dispatch(actions,...args)
            }

3.挨个调用中间件就行了

import compose from "./compose"

export default function applyMiddleware(...middlewares){
    return (createStore) => {
        return (reducer) => {
            const store = createStore(reducer)
            let dispatch = store.dispatch
            const middlAPI = {
                getState : store.getState,
                   //中间件调用的加强版的不是原版的
                dispatch:(actions,...args) => dispatch(actions,...args)
            }

            //中间件数组
            const middlewareChain = middlewares.map(i => i(middlAPI))
            //挨个调用中间件
            dispatch = compose(...middlewareChain)(store.dispatch)

            return {
                ...store,
                //加强版dispatch
                dispatch
            }
        }
    }
}

logger

export default function logger({getState,dispatch}){
    //next:store.dispatch
    //next => 加强版dispatch
    //next=>fn,这个fn作为thunk的参数因此这个action就是从thunk里拿的
    return next => (action)=>{
        console.log('----------------------------------');
        console.log('action:',action);
        const preState = getState()
        console.log('preState:',preState);
        const returnValue = next(action);
        const nextState = getState();
        console.log('nextState:',nextState);
        console.log('----------------------------------');
        return returnValue
    }
}

thunk

export default function thunk({getState,dispatch}){
    //这个next就是logger返回的fn
    return next => (action) => {
        if(typeof action === 'function'){
            return action(dispatch,getState)
        }
        return next(action)
    }
}