React@16.x(62)Redux@4.x(11)- 中间件2 - redux-thunk

1,介绍

一般情况下,action 是一个平面对象,并会通过纯函数来创建。

export const createAddUserAction = (user) => ({
    type: ADD_USER,
    payload: user,
});

这样是有一些限制的

  • 无法使用异步的,比如在请求接口之后再做一些操作。
  • 或根据条件,同时 dispatch 多个 action

redex-thunk 中间件的作用:允许 action 是一个函数,而不是一个平面对象。

举例

React@4.x 版本使用 redux-thunk@2.4.2 版本。

export const createAddUserAction = (user) => ({
    type: ADD_USER,
    payload: user,
});

export const createSetLoadingAction = (isLoading) => ({
    type: SET_LOADING,
    payload: isLoading,
});

export const fetchUsers = () => {
    return async (dispatch) => {
        dispatch(createSetLoadingAction(true))
        const res = await getAllUsers();
        dispatch(createAddUserAction(res))
        dispatch(createSetLoadingAction(false))
    }
}
// 使用
import { createStore, applyMiddleware } from "redux";
import thunk from "redux-thunk";
import { fetchUsers } from "./action/userAction";

const store = createStore(reducer, applyMiddleware(thunk));
store.dispatch(fetchUsers())

这个函数有3个参数:

  1. dispatch,就是 store.dispatch
  2. getState,就是 store.getState
  3. extra,设置的额外的参数。

2,原理和实现

整体流程:

在这里插入图片描述

实现

中间件的写法参考 这篇文章

function thunkMiddleware(extra) {
    return (store) => (next) => (action) => {
        if (typeof action === "function") {
            return action(store.dispatch, store.getState, extra);
        }
        return next(action);
    };
}

const thunk = thunkMiddleware({});
thunk.withExtraArgument = thunkMiddleware;
export default thunk;

3,注意点

因为 redux-thunk 会修改 action 的类型,所以书写顺序通常会作为第一个。


以上。

相关推荐

  1. React@16.x(54)Redux@4.x(3)- reducer

    2024-07-19 09:46:02       22 阅读
  2. React@16.x(53)Redux@4.x2)- action

    2024-07-19 09:46:02       21 阅读
  3. React@16.x(55)Redux@4.x4)- store

    2024-07-19 09:46:02       21 阅读
  4. React@16.x(52)Redux@4.x(1)- 核心概念

    2024-07-19 09:46:02       19 阅读
  5. React@16.x(56)Redux@4.x(5)- 实现 createStore

    2024-07-19 09:46:02       16 阅读
  6. React@16.x(58)Redux@4.x(7)- 实现 combineReducers

    2024-07-19 09:46:02       19 阅读
  7. React@16.x(57)Redux@4.x(6)- 实现 bindActionCreators

    2024-07-19 09:46:02       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 09:46:02       53 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 09:46:02       56 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 09:46:02       46 阅读
  4. Python语言-面向对象

    2024-07-19 09:46:02       57 阅读

热门阅读

  1. 2、PostgreSQL之基本的SQL语言

    2024-07-19 09:46:02       18 阅读
  2. 【Linux】服务器安装SSH

    2024-07-19 09:46:02       12 阅读
  3. Shell 进阶教程:提升你的脚本编写技巧

    2024-07-19 09:46:02       18 阅读
  4. Transformer中的自注意力是怎么实现的?

    2024-07-19 09:46:02       16 阅读
  5. 用Python爬虫能实现什么?

    2024-07-19 09:46:02       16 阅读
  6. Flink Sql和Flink DataStream的区别及使用场景

    2024-07-19 09:46:02       15 阅读
  7. Spring Boot 整合Mybatis-Plus联表分页查询

    2024-07-19 09:46:02       17 阅读
  8. 【vue】自定义指令

    2024-07-19 09:46:02       15 阅读
  9. 极速删除 node_modules 仅3 秒()

    2024-07-19 09:46:02       16 阅读