上文在 componentDidMount 中定义了axios 中请求,或把一些非常复杂的逻辑都放在这个里面的时候,这个组件会显得很冗余。
所以遇到这种异步请求或复杂的逻辑,应该移除到其他地方进行管理。可移到 Redux-thunk 这个中间件,可使我们把 异步请求 和 复杂的逻辑放到action 里去处理。

一、 使用 redux-thunk

安装和使用参照:
https://github.com/reduxjs/redux-thunk
我这用的 yarn 安装 :yarn add redux-thunk
然后重启项目。

在创建store 的时候要使用这个中间件。
引入[applyMiddleware()](https://redux.js.org/api/applymiddleware) 的方法。
引入 thunk
在 createStore() 方法传递第二个参数:applyMiddleware(thunk) 使用thunk 这个中间件

  1. // store/index.js
  2. import { createStore, applyMiddleware } from 'redux';
  3. import thunk from 'redux-thunk';
  4. import reducer from './reducer'
  5. const store = createStore(
  6. reducer,
  7. // 用了 thunk 和 REDUX_REDUX_DEVTOOLS_EXTENSION 的中间件,
  8. applyMiddleware(thunk)
  9. export default store;

解决 thunk 和 REDUX_REDUX_DEVTOOLS_EXTENSION 的这两个中间件 一起使用的问题:
https://github.com/zalmoxisus/redux-devtools-extension
image.png
拷贝过来,修改后:

  1. // store/index.js
  2. import { createStore, applyMiddleware, compose } from 'redux';
  3. import thunk from 'redux-thunk';
  4. import reducer from './reducer'
  5. // 解决 thunk 和 REDUX_REDUX_DEVTOOLS_EXTENSION 的中间件 一起使用的问题
  6. const composeEnhancers =
  7. window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
  8. window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
  9. // componse 函数要在上面引入进来
  10. }) : compose;
  11. const enhancer = composeEnhancers(
  12. applyMiddleware(thunk),
  13. );
  14. const store = createStore(
  15. reducer,
  16. enhancer
  17. );
  18. export default store;

再重启。以上就使用好了 redux-thunk 了,可开始编写代码了。

二、围绕redux-thunk开始编写代码

就可以把异步操作的代码移到 action 里去了,actionCreator return 结果 可以是一个函数了,函数
组件中的action 可以是一个函数了。:const action = getTodoList(); 以前只能是对象。
当你在 actionCreator 中,当你调用里面的一个函数,生成的内容是函数的action 的时候,这个函数接收到store的dispatch 方法,所以直接传递,下面就可以使用了,

actionCreato.js

  1. import axios from 'axios';
  2. export const getTodoList = () => {
  3. return (dispatch) => {
  4. axios.get('/list.json').then((res) => {
  5. const data = res.data;
  6. const action = initListAction(data);
  7. //action 派发
  8. dispatch(action);
  9. })
  10. }
  11. }

TodoList.js

  1. import { getInputChangeAction, getAddTodoItem, getDeleteItem, getTodoList } from './store/actionCreator';
  1. componentDidMount() {
  2. const action = getTodoList();
  3. store.dispatch(action)
  4. console.log(action);
  5. }

实现效果:
image.png