美文网首页
Redux 中间件(一)

Redux 中间件(一)

作者: 誑逩蝸犇 | 来源:发表于2017-09-03 13:57 被阅读0次

    中间件

    Middleware 可以让你包装 store 的 dispatch方法来达到你想要的目的。同时, middleware 还拥有“可组合”这一关键特性。多个 middleware 可以被组合到一起使用,形成 middleware 链。其中,每个 middleware 都不需要关心链中它前后的 middleware 的任何信息。
    首先Redux常用的中间件的功能有:日志记录、异步调用等功能。中间件是为了拓展程序功能而存在。通常由框架提供实现接口的方案

    logger中间件的作用

    redux-logger中间件,实现的功能是打印出一个action发出之后,state的更改的过程。一个简单的事例

    actions.js

    let nextTodoId = 0
    export const addTodo = (text) => ({
      type: 'ADD_TODO',
      id: nextTodoId++,
      text
    })
    

    reducers.js

    const todos = (state = [], action) => {
      switch (action.type) {
        case 'ADD_TODO':
          return [
            ...state,
            {
              id: action.id,
              text: action.text,
              completed: false
            }
          ]
        default:
          return state
      }
    }
    
    export default todos
    

    index.js

    import React from 'react';
    import ReactDOM from 'react-dom';
    
    import {applyMiddleware,createStore} from 'redux';
    
    import logger from 'redux-logger';
    
    import './index.css';
    import App from './App';
    import * as actions from './actions';
    import reducers from './reducers';
    import registerServiceWorker from './registerServiceWorker';
    
    const store = createStore(reducers,applyMiddleware(logger));
    
    store.dispatch(actions.addTodo('add ToDo'));
    
    
    ReactDOM.render(<App />, document.getElementById('root'));
    registerServiceWorker();
    

    以上代码运行结果如下所示:

    redux-logger.PNG

    从运行结果可以看到,dispatch一个addTodo action后,redux-logger中间件会打印出action运行之前的state ,然后是action的值,最后是action执行之后的 next state的值;下面要讨论的就是这样的一个中间件形成的一个过程。

    最原始的实现

    如果要提供以上的logger功能,有一个极其简单的方法,即替换掉store.dispatch方法:

    import React from 'react';
    import ReactDOM from 'react-dom';
    
    import {applyMiddleware,createStore} from 'redux';
    
    // import logger from 'redux-logger';
    
    import './index.css';
    import App from './App';
    import * as actions from './actions';
    import reducers from './reducers';
    import registerServiceWorker from './registerServiceWorker';
    
    // const store = createStore(reducers,applyMiddleware(logger));
    
    const store = createStore(reducers);
    
    
    let dispatch = store.dispatch;
    //替换掉store原始的dispatch
    store.dispatch = (action) => {
        console.log('prev state',store.getState());
        console.log('dispatch',action);
        let result = dispatch(action);
        console.log('next state',store.getState());
    
        return result;
    }
    
    
    store.dispatch(actions.addTodo('add ToDo'));
    
    
    ReactDOM.render(<App />, document.getElementById('root'));
    registerServiceWorker();
    
    

    这样就可以在发布action之前和之后都打印出state的值了。虽然这只是一个很简单的替换store的dispatch,但是确实实现了这个功能,而这也是redux中间件最核心的四项。其他的都是为了扩展性而围绕着这个核心设计的。

    相关文章

      网友评论

          本文标题:Redux 中间件(一)

          本文链接:https://www.haomeiwen.com/subject/ymtjjxtx.html