美文网首页
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中间件最核心的四项。其他的都是为了扩展性而围绕着这个核心设计的。

相关文章

  • react 面试

    react redux (所有数据都放入redux管理) 1、redux中间件原理(middleware) 中间件...

  • 2-Redux中间件

    Redux 中间件 [toc] Redux 中间件的作用 Reudx 中的中间件是通过对 dispatch 进行的...

  • Redux 中间件源码清源

    网上的Redux中间件原理解释多有疏漏,譬如我在多篇blog上看到Redux中间件解释以及Redux中间件深入浅出...

  • Day17. Redux深入

    如何使用redux-thunk 中间件的使用, redux-thunk redux-devtools redux开...

  • react技术栈

    关于 Redux 中间件 Redux 的中间件是定义一个函数,对 dispatch 进行改造,在发出 action...

  • [源码] Redux React-Redux01

    redux中间件洋葱模型imageimage redux中间件注意点image 导航 [深入01] 执行上下文[h...

  • Redux-saga

    Redux-saga 概述 redux-saga是一个用于管理redux应用异步操作的中间件,redux-saga...

  • React.js学习笔记(14) React-router-re

    (一) react-router-redux中间件 (1) 安装react-router-redux react-...

  • react项目中引入redux+react-router的一些写

    Redux + react-router 关于redux中间件的理解https://zhuanlan.zhihu....

  • Redux-基础

    参考Redux 入门教程(一):基本用法 Redux 入门教程(二):中间件与异步操作 Redux 入门教程(...

网友评论

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

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