React-Redux-thunk

简介: React-Redux-thunk

前言


React-Redux-Thunk是一个用于处理Redux异步操作的中间件,它扩展了Redux的能力,使您能够更轻松地处理异步操作,如网络请求或定时任务。


通常,Redux的reducers是同步的,但在现实应用中,需要在数据获取或其他异步操作完成后才能更新状态。这就是React-Redux-Thunk发挥作用的地方。




当前保存异步数据存在的问题


异步数据既然要保存到 Redux 中, 所以获取异步数据也应该是 Redux 的一部分,所以获取异步数据的代码应该放到 Redux 中, 而不是放到组件生命周期方法中。



在 Redux 中获取网络数据


  • 使用 redux-thunk 中间件

redux-thunk 作用

默认情况下 dispatch 只能接收一个对象, 使用 redux-thunk 可以让 dispatch 除了可以接收一个对象以外, 还可以接收一个函数, 是的通过 dispatch 派发一个函数的时候能够去执行这个函数, 而不是执行 reducer 函数。



使用 redux-thunk

  • 安装 redux-thunk
npm install redux-thunk
  • 在创建 store 时应用 redux-thunk 中间件

修改 store.js:

import {createStore, applyMiddleware} from 'redux'
import thunkMiddleware from 'redux-thunk'
import reducer from './reducer';
// 创建store之前,通过applyMiddleware方法,告诉Redux需要应用哪些中间件
const storeEnhancer = applyMiddleware(thunkMiddleware);
// 利用store来保存状态(state)
const store = createStore(reducer, storeEnhancer);
export default store;


  • 在 action 中获取网络数据
export const getUserInfo = (dispatch, getState) => {
    fetch('http://127.0.0.1:7001/info')
        .then((response) => {
            return response.json();
        })
        .then((data) => {
            console.log('在action中获取到的网络数据', data);
        })
        .catch((error) => {
            console.log(error);
        });
}
  • 在组件中派发 action
import React from 'react';
import {getUserInfo} from "../store/action";
import connect from "../connect/connect";
class About extends React.PureComponent {
    componentDidMount() {
        this.props.changeInfo();
    }
    render() {
        return (
            <div>
                <p>{this.props.info.name}</p>
                <p>{this.props.info.age}</p>
            </div>
        )
    }
}
const mapStateToProps = (state) => {
    return {
        info: state.info
    }
};
const mapDispatchToProps = (dispatch) => {
    return {
        changeInfo() {
            dispatch(getUserInfo);
        }
    }
};
export default connect(mapStateToProps, mapDispatchToProps)(About);
  • 最终在 action 当中保存数据,在派发的方法当中会自动的将 dispatch 传入到方法的参数列表上,然后可以在通过 dispatch 在此派发任务进行保存数据,更改 action.js
export const getUserInfo = (dispatch, getState) => {
    fetch('http://127.0.0.1:7001/info')
        .then((response) => {
            return response.json();
        })
        .then((data) => {
            dispatch(changeAction(data));
        })
        .catch((error) => {
            console.log(error);
        });
}




注意点


默认情况下 dispatch 方法只能接收一个对象, 如果想让 dispatch 方法除了可以接收一个对象以外, 还可以接收一个方法, 那么我们可以使用 redux-thunk 中间件, redux-thunk 中间件的作用,可以让 dispatch 方法可以接收一个函数, 可以让我们在通过 dispatch 派发任务的时候去执行我们传入的方法。




总结


  • 使用 redux-thunk 之前的流程
--------------------
        ------>  | Component 异步请求 |  -----
       |         --------------------       |
       |                                    ↓
-------------       -------------       -------------
|   Store   | <---- |  Reducer  | <---- |  Action   |
-------------       -------------       -------------
  • 使用 redux-thunk 之后
-------------
        --------->  | Component |  ---------------------------------
       |            -------------                                   |
       |                                                            ↓
-------------       -------------       -------------       -------------
|   Store   | <---- |  Reducer  | <---- |  异步请求   | <---- |  Action   |
-------------       -------------       -------------       -------------



官方文档地址




最后

本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

相关文章
|
Java Maven
IDEA 2018 2020 2021 2022 各版本对Maven版本兼容问题汇总
Maven3.6.3版本兼容问题 错误信息如下: 测试范围如下图: 注意:针对一些老项目 还是尽量采用 3.6.3版本,针对idea各个版本的兼容性就很兼容 0.IDEA 2022 兼容maven 3.8.1及之前的所用版本 1.IDEA 2021 兼容maven 3.8.1及之前的所用版本 2.IDEA 2020 兼容Maven 3.6.3及之前所有版本 3.IDEA 2018 兼容Maven3.6.1及之前所有版本
4961 0
IDEA 2018 2020 2021 2022 各版本对Maven版本兼容问题汇总
|
7月前
|
弹性计算 Ubuntu Linux
一键部署OpenWebUI+Ollama到阿里云ECS,轻松运行DeepSeek!(保姆级教程)
在当今数据驱动的时代,快速部署和管理大模型成为企业的关键需求。阿里云提供了一键部署OpenWebUI+Ollama的便捷方案,支持本地大模型运行和管理。用户也可以选择连接阿里云百炼的在线模型。
一键部署OpenWebUI+Ollama到阿里云ECS,轻松运行DeepSeek!(保姆级教程)
|
网络协议 Dubbo 应用服务中间件
实操指南:Postman 怎么调试 WebSocket
WebSocket 是一个支持双向通信的网络协议,它在实时性和效率方面具有很大的优势。Postman 是一个流行的 API 开发工具,它提供了许多功能来测试和调试 RESTful API 接口,最新的版本也支持 WebSocket 接口的调试。想要学习更多关于 Postman 的知识,可访问 Postman 中文文档。在本文中,我们将介绍如何使用 Postman 调试 WebSocket 接口。
|
前端开发 NoSQL JavaScript
node-blog:用 node 搭建的个人开源博客
node-blog:用 node 搭建的个人开源博客
196 0
|
安全 Java API
springboot 单点登录实现原理
【7月更文挑战第2天】单点登录(Single Sign-On,SSO)是一种用户认证方式,用户在多个应用系统中只需要登录一次,就可以访问所有相互信任的应用系统。
285 1
|
Kubernetes NoSQL Go
Go 优秀库推荐 - 命令行工具 cobra
spf13/cobra 和 urfave/cli 是Go的2个优秀命令行工具:
824 0
Go 优秀库推荐 - 命令行工具 cobra
|
SQL 监控 关系型数据库
解密MySQL二进制日志:深度探究mysqlbinlog工具
解密MySQL二进制日志:深度探究mysqlbinlog工具
1849 3
|
测试技术
深入白盒测试:提升软件结构透视能力
【4月更文挑战第23天】在软件测试的广阔天地中,白盒测试以其独特的内在逻辑和代码透视能力而显得尤为重要。它不仅仅是一个测试方法,更是一种确保软件质量和可靠性的重要手段。本文将深入探讨白盒测试的概念、方法和最佳实践,旨在为软件开发和测试人员提供一种系统的视角,以帮助他们更好地理解并应用白盒测试技术,进而提高软件产品的质量。
259 0
|
机器学习/深度学习 存储 算法
【机器学习】支持向量机 SVM(非常详细)
SVM 想要的就是找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。
【机器学习】支持向量机 SVM(非常详细)
|
数据采集 存储 测试技术
python+pytest接口自动化(9)-cookie绕过登录(保持登录状态)
在编写接口自动化测试用例或其他脚本的过程中,经常会遇到需要绕过用户名/密码或验证码登录,去请求接口的情况,一是因为有时验证码会比较复杂,比如有些图形验证码,难以通过接口的方式去处理;再者,每次请求接口前如果都需要先去登录一次,这样不仅效率低,还耗费资源。 有些网站是使用cookie辨别用户身份的,此时我们便可以先登录一次,拿到登录成功后的cookie,后续请求时在请求头中加入该cookie,便可保持登录状态直接请求。
python+pytest接口自动化(9)-cookie绕过登录(保持登录状态)