关于redux 中间件

在redux中,我们通过dispatch action来更新数据状态,通过reducer来返回新的状态
如果我们想要记录某个状态更新前后的日志,那么我们只需要在此处的dispatch前后做一些处理即可
那如果我们要记录所有状态更新的日志呢?在所有调用disaptch的地方都加上日志处理?这显然不够优雅
但这就是redux中间件要解决的问题

redux中间件内部通过对createStore进行增强,从而重写了dispatch,为我们在dispatch action到达reducer的前后提供了逻辑插入点,对日志记录、异步action、异常监控等功能提供支持

使用中间件

以redux-thunk为例,演示一下如何使用中间件

  1. 引入applyMiddleWare和中间件
  2. 将applyMiddleWare(thunk)作为createStore的第二个参数传入
  3. 在组件中使用函数作为action,中间件会为action函数注入dispatch参数以供调用

store.js

import {createStore,applyMiddleware} from 'redux'
import countReducer from './reducer'

import thunk from 'redux-thunk'
const store = createStore(countReducer,applyMiddleware(thunk))

export default store

actionCreator.js

/* 
异步状态更新和一般case的区别就是,返回的action是一个函数
给这个函数注入dispatch作为参数,那么就能在函数里做异步dispatch
 */
import {INCREMENT,DECREMENT} from './constant'
const createIncrementAction = (data)=>({type:INCREMENT,data})
const createAsyncDecrementAction = (data)=>{
    return (dispatch)=>{
        setTimeout(() => {
            dispatch({type:DECREMENT,data})
        }, 1000);
    }
}

export {
    createIncrementAction,
    createAsyncDecrementAction
}

Count.jsx

import React, { Component } from 'react'
import {
  createAsyncDecrementAction,
  createIncrementAction
} from '../redux/actionCreator'
import store from '../redux/store'

class Count extends Component {
  componentDidMount() {
    store.subscribe(() => {
      this.setState({})
    })
  }

  handleIncrement(data) {
    const { dispatch } = store
    dispatch(createIncrementAction(data))
  }

  handleDecrement(data) {
    const { dispatch } = store
    dispatch(createAsyncDecrementAction(data))
  }

  render() {
    const { count } = store.getState()
    return (
      <div>
        <span>{count}</span>
        <button onClick={() => this.handleIncrement(1)}>+</button>
        <button onClick={() => this.handleDecrement(1)}>-</button>
      </div>
    )
  }
}

export default Count