1. redux-thunk 中间件

目标:能够使用 redux-thunk 中间件处理异步操作

1.1 基础语法

知识点:

  1. 是什么 ? redux-thunk 中间件可以处理函数形式的 action。因此在函数形式的 action 中就可以执行异步操作
  2. 语法:
  • thunk action 是一个函数
  • 函数包含两个参数:1. dispatch、2. getState

落地代码:

  1. // 函数形式的 action
  2. const thunkAction = () => {
  3. return (dispatch, getState) => {}
  4. }
  5. // 解释:
  6. const thunkAction = () => {
  7. // 注意:此处返回的是一个函数,返回的函数有两个参数:
  8. // 第一个参数:dispatch 函数,用来分发 action
  9. // 第二个参数:getState 函数,用来获取 redux 状态
  10. return (dispatch, getState) => {
  11. setTimeout(() => {
  12. // 执行异步操作
  13. // 在异步操作成功后,可以继续分发对象形式的 action 来更新状态
  14. }, 1000)
  15. }
  16. }

1.2 使用 redux-thunk 前后对比

  1. 不使用 redux-thunk 中间件,action 只能是一个对象 ```jsx // 1 普通 action 对象 // { type: ‘counter/increment’ } dispatch({ type: ‘counter/increment’ })

// 2 action creator const increment = payload => ({ type: ‘counter/increment’, payload }) dispatch(increment(2))

  1. 2. **使用 redux-thunk 中间件后,action 既可以是对象,又可以是函数**
  2. ```jsx
  3. // 1 对象:
  4. // 使用 action creator 返回对象
  5. const increment = payload => ({ type: 'counter/increment', payload })
  6. // 分发同步 action
  7. dispatch(increment(2))
  8. // 2 函数:
  9. // 使用 action creator 返回函数
  10. const incrementAsync = () => {
  11. return (dispatch, getState) => {
  12. // ... 执行异步操作代码
  13. }
  14. }
  15. // 分发异步 action
  16. dispatch(incrementAsync())

1.3 体验 redux-thunk

实现步骤:

  1. 安装:yarn add redux-thunk
  2. 导入 redux-thunk
  3. 将 thunk 添加到 applyMiddleware 函数的参数(中间件列表)中
  4. 创建函数形式的 action,在函数中执行异步操作

落地代码:

store/index.js 中:

  1. // 导入 thunk 中间件
  2. import thunk from 'redux-thunk'
  3. // 将 thunk 添加到中间件列表中
  4. const store = createStore(rootReducer, applyMiddleware(thunk))

actions/index.js 中:

  1. export const clearAllAsync = () => {
  2. return (dispatch) => {
  3. // 处理异步的代码:1 秒后再清理已完成任务
  4. setTimeout(() => {
  5. dispatch(clearAll())
  6. }, 1000)
  7. }
  8. }

App.js 中:

  1. import { clearTodoAsync } from '../store/actions/todos'
  2. const TodoFooter = () => {
  3. return (
  4. // ...
  5. <button
  6. className="clear-completed"
  7. onClick={() => dispatch(clearTodoAsync())}
  8. >
  9. Clear completed
  10. </button>
  11. )
  12. }

2. 了解 redux-thunk 中间件原理

目标:能够了解 redux-thunk 中间件的原理

知识点:

redux-thunk@v2.3 源码链接

  1. function createThunkMiddleware(extraArgument) {
  2. // Redux 中间件的写法:const myMiddleware = store => next => action => { /* 此处写 中间件 的代码 */ }
  3. return ({ dispatch, getState }) => (next) => (action) => {
  4. // redux-thunk 的核心代码:
  5. // 判断 action 的类型是不是函数
  6. // 如果是函数,就调用该函数(action),并且传入了 dispatch 和 getState
  7. if (typeof action === 'function') {
  8. return action(dispatch, getState, extraArgument);
  9. }
  10. // 如果不是函数,就调用下一个中间件(next),将 action 传递过去
  11. // 如果没有其他中间件,那么,此处的 next 指的就是:Redux 自己的 dispatch 方法
  12. return next(action);
  13. }
  14. }
  15. // 所以,在使用了 redux-thunk 中间件以后,那么,redux 就既可以处理 对象形式的 action 又可以处理 函数形式的 action 了
  16. // 1 处理对象形式的 action
  17. dispatch({ type: 'todos/clearAll' }) // 对应上面第 14 行代码
  18. // 2 处理函数型的 action
  19. export const clearAllAsync = () => {
  20. return dispatch => {
  21. // 在此处,执行异步操作
  22. setTimeout(() => {
  23. // 异步操作完成后,如果想要修改 redux 中的状态,就必须要
  24. // 分发一个 对象形式的 action(同步的 action)
  25. dispatch({ type: types.CLEAR_ALL })
  26. }, 1000)
  27. }
  28. }
  29. dispatch(clearAllAsync()) // 对应上面第 8、9 行代码

3. redux-devtools-extension中间件

目标:能够使用 chrome 开发者工具调试跟踪 redux 状态

知识点:

  1. redux-devtools-exension 文档
  2. 先给 Chrome 浏览器安装 redux 开发者工具,然后,就可以查看 Redux 状态了

实现步骤:

  1. 安装: yarn add redux-devtools-extension
  2. 从该中间件中导入 composeWithDevTools 函数
  3. 调用该函数,将 applyMiddleware() 作为参数传入
  4. 打开 Chrome 浏览器的 redux 开发者工具并使用

落地代码:

  1. import thunk from 'redux-thunk'
  2. import { composeWithDevTools } from 'redux-devtools-extension'
  3. const store = createStore(reducer, composeWithDevTools(applyMiddleware(thunk)))
  4. export default store