react-状态管理redux-thunk的使用

2019-07-13  本文已影响0人  四月的谎言v5

完整 demo https://gitee.com/siyuev5/react-demo/tree/master/redux-thunk-demo

redux-thunk 是一个中间件 拿来实现异步操作的 我也不知道咋解释看代码吧

npm install redux redux-thunk

redux/index.js 如下

import { createStore, applyMiddleware, compose } from 'redux'
import thunk from 'redux-thunk'
import reducer from './reducer'

//支持调试工具
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
  ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({})
  : compose

const enhancer = composeEnhancers(applyMiddleware(thunk))
export default createStore(reducer, enhancer)

redux/reducer.js 如下

import * as actionTypes from './actionTypes'

const defaultState = {
  list: []
}
export default (state = defaultState, action) => {
  switch (action.type) {
    case actionTypes.ADD_LIST_ITEM:
      return {
        ...state,
        list: [...state.list, action.value]
      }
      break

    default:
      break
  }
  return state
}

redux/actionTypes.js 如下

export const ADD_LIST_ITEM = 'add_list_item'

redux/actionCreators.js 如下

import * as actionTypes from './actionTypes'

export const GetAddListItemAction = value => ({
  type: actionTypes.ADD_LIST_ITEM,
  value
})

export const asyncGetAddListItemAction = () => {
  return dispatch => {
    //模拟异步加载
    setTimeout(() => {
      dispatch(GetAddListItemAction('我是异步数据'))
    }, 500)
  }
}

使用发方式

import redux from './redux/index'
import * as actions from './redux/actionCreators'

 const action = actions.asyncGetAddListItemAction()
  redux.dispatch(action)

和以往不同的是redux.dispatch 在不使用 redux-thunk 只能传递一个 {} 对象,使用 redux-thunk 中间件的时候可以传递一个函数, redux-thunk 内部会判断 redux.dispatch 参数是对象还是方法,如果是方法就调用并且传递 2个参数,第一个参数就是 redux 原生的 dispatch 方法,这样网络请求异步通知后 可以直接调用redux.dispatch 像最开始那样传递一个对象过去,第二个参数就是 redux.getState 方法,可以 getState() 直接调用获取state 内部做些处理判断。

export const asyncGetAddListItemAction = () => {
  return dispatch => {
    //模拟异步加载
    setTimeout(() => {
      dispatch(GetAddListItemAction('我是异步数据'))
    }, 500)
  }
}
上一篇下一篇

猜你喜欢

热点阅读