redux-thunk logger applyMiddleware

前端之家收集整理的这篇文章主要介绍了redux-thunk logger applyMiddleware前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1 依赖:applyMiddleware源码

  1. export default function applyMiddleware() {
  2. for (var _len = arguments.length,middlewares = Array(_len),_key = 0; _key < _len; _key++) {
  3. middlewares[_key] = arguments[_key];
  4. }
  5.  
  6. return function (createStore) {
  7. //enhancer(createStore)(reducer,preloadedState);这里的enhancer就是applyMiddleware(thunk,logger)
  8. //enhancer(createStore)返回值就是下面这个函数
  9. return function (reducer,preloadedState,enhancer) {
  10. //还是先创建一个store;
  11. var store = createStore(reducer,enhancer);
  12. //下面对创建的store中的dispatch进行改造;
  13. var _dispatch = store.dispatch;
  14. var chain = [];
  15.  
  16. var middlewareAPI = {
  17. getState: store.getState,dispatch: function dispatch(action) {
  18. return _dispatch(action);
  19. }
  20. };
  21. //放入到chain数组中的函数都形成了闭包;
  22. chain = middlewares.map(function (middleware) {
  23. //在这里对thunk和logger
  24. return middleware(middlewareAPI);
  25. });
  26. //将_dispatch指向新的函数;传入的store.dispatch还是原始的dispatch;
  27. _dispatch = compose.apply(undefined,chain)(store.dispatch);
  28. //_dispatch = chain[0](chain[1](store.dispatch));
  29. //chain[1](store.dispatch) 返回值是一个函数,该返回值作为chain[0]的参数;
  30. //chain[0](chain[1](store.dispatch)) 的返回值是在下面源码处有注释
  31. //返回最后的store
  32. return _extends({},store,{
  33. dispatch: _dispatch
  34. });
  35. };
  36. };
  37. }

2 redux-thunk源码

  1. 'use strict';
  2.  
  3. exports.__esModule = true;
  4. function createThunkMiddleware(extraArgument) {
  5. //下面返回函数其实就是thunk;
  6. return function (_ref) {
  7. //_ref就是middleWareAPI
  8. var dispatch = _ref.dispatch,getState = _ref.getState;
  9. //下面就是middleware(middlewareAPI);的返回值,被放到chain数组中,chain[0],形成闭包;
  10. return function (next) { //这里的next就是chain[1](store.dispatch);
  11. return function (action) { //这里就是 chain[0](chain[1](store.dispatch)) 也就是最终的dispatch,所以最终可以dispatch(action);
  12. if (typeof action === 'function') {
  13. return action(dispatch,getState,extraArgument);
  14. }
  15. //如果action不是函数,那么就执行next,就是chain[1](store);
  16. return next(action);
  17. };
  18. };
  19. };
  20. }
  21.  
  22. var thunk = createThunkMiddleware();
  23. thunk.withExtraArgument = createThunkMiddleware;
  24.  
  25. exports['default'] = thunk;

什么是thunk

  1. // Meet thunks.
  2. // A thunk is a function that returns a function.
  3. // This is a thunk.

3 Redux-logger源码

  1. function createLogger() {
  2. //......删除了一些判断代码
  3. return function (_ref) {
  4. // _ref就是middleWareAPI
  5. var getState = _ref.getState;
  6. //chain[1]其实就是这个函数;形成闭包;
  7. return function (next) {
  8. //chain[1](store.dispatch)就是下面这个函数
  9. return function (action) {
  10. console.log('dispatch 前:',middlewareAPI.getState());
  11. var returnedValue = next(action);
  12. console.log('dispatch 后:',middlewareAPI.getState(),'\n');
  13. return returnedValue;
  14. };
  15. };
  16. };
  17. }
  18. //这里的{dispatch,getState}其实就是applyMiddleware中的
  19. /*
  20. var middlewareAPI = {
  21. getState: store.getState,dispatch: function dispatch(action) {
  22. return _dispatch(action);
  23. }
  24. };
  25. */
  26. //下面返回函数其实就是logger;
  27. const defaultLogger = ({ dispatch,getState } = {}) => {
  28. if (typeof dispatch === 'function' || typeof getState === 'function') {
  29. //下面就是middleware(middlewareAPI);的返回值,被放到chain数组中,chain[1]
  30. return createLogger()({ dispatch,getState });
  31. }
  32. }
  33. export {defaultLogger as logger}

上面两者被放到chain数组中的函数其实都是类似于这样的

  1. return function (next) {
  2. return function (action) {
  3. };
  4. };

4 logger最简化代码

  1. function logger(middlewareAPI) {
  2. return function (next) {
  3. return function (action) {
  4. console.log('dispatch 前:',middlewareAPI.getState());
  5. var returnValue = next(action);
  6. console.log('dispatch 后:','\n');
  7. return returnValue;
  8. };
  9. };
  10. }

5 结合applyMiddleware改进dispatch;

  1. //createStore源码中有这么一行代码
  2. enhancer(createStore)(reducer,logger)
  3. //============
  4. const store = createStore(
  5. reducer,applyMiddleware(thunk,logger)
  6. );

redux-thunk

猜你在找的React相关文章