Redux Thunk深入理解与使用指南

news/2024/12/19 11:11:31/文章来源:https://www.cnblogs.com/shyhuahua/p/18616757

一、什么是 Redux Thunk?

在 React 应用中,Redux 是一个常用的状态管理工具。但 Redux 本身是一个纯同步状态管理工具,它的 dispatch 方法默认只支持同步操作。如果我们想要处理异步逻辑(如请求接口、延时操作等),需要使用中间件(middleware)。
Redux Thunk 就是一个用于处理异步操作的 Redux 中间件。 简单来说,redux-thunk 允许我们在 Redux 的 dispatch 中,发送一个函数(thunk),而不仅仅是普通的 action 对象。这种方式可以让我们在函数中执行异步逻辑,并根据异步操作的结果再决定是否发起新的同步 action。

二、Thunk 是什么?

从术语角度看,Thunk 是一个术语,表示延迟计算的函数。
在 JavaScript 中,Thunk 通常是一个接受函数作为参数并延迟执行的函数。例如:

const thunk = () => {return () => {console.log('This is a thunk function!');};
};
const fn = thunk();
fn(); // 输出:This is a thunk function!

在 Redux 中,Thunk 表现为一个函数形式的 Action,通过 redux-thunk 中间件处理后,允许我们在函数中执行异步逻辑并手动调用 dispatch。

三、为什么需要 Redux Thunk?

在 Redux 的默认实现中,dispatch 只能接受普通对象作为 Action,例如:

store.dispatch({ type: 'INCREMENT' });

但是在实际开发中,我们经常需要处理异步操作,例如:

• 从 API 获取数据后将结果保存到 Redux 中

• 在某些操作后进行异步日志记录

• 等待某个 Promise 完成后再触发后续 Action 

Redux 默认的机制无法直接处理异步逻辑,因此我们需要借助中间件扩展 dispatch 的能力。

四、Redux Thunk 的工作原理

redux-thunk 的核心是拦截 dispatch 方法,检查传入的 action。如果是一个函数,就执行这个函数并传入 dispatch 和 getState 两个参数;如果是普通对象,则直接传递给 Reducer。

核心代码实现:

const thunkMiddleware = ({ dispatch, getState }) => next => action => {if (typeof action === 'function') {return action(dispatch, getState);}return next(action);
};
export default thunkMiddleware;

五、Redux Thunk 的使用

1. 安装 Redux Thunk 在使用前,需要安装 redux-thunk 包:

npm install redux-thunk

2. 配置中间件 将 redux-thunk 中间件添加到 Redux store:

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers';const store = createStore(rootReducer, applyMiddleware(thunk));

3. 编写异步 Action
在普通 Redux 中,Action 是一个对象,而使用 redux-thunk 后,Action 可以是一个函数:

// 异步 Action
const fetchUserData = (userId) => {return async (dispatch, getState) => {dispatch({ type: 'FETCH_USER_REQUEST' });try {const response = await fetch(`https://api.example.com/user/${userId}`);const data = await response.json();dispatch({ type: 'FETCH_USER_SUCCESS', payload: data });} catch (error) {dispatch({ type: 'FETCH_USER_FAILURE', error });}};
};

4. 调用异步 Action 通过 dispatch 调用异步 Action:

store.dispatch(fetchUserData(1));

六、示例:完整的用户数据获取流程

以下是一个完整示例,展示如何通过 redux-thunk 获取用户数据并更新 Redux 状态。

Reducer 定义用户数据的 Reducer:

const initialState = {loading: false,user: null,error: null,
};const userReducer = (state = initialState, action) => {switch (action.type) {case 'FETCH_USER_REQUEST':return { ...state, loading: true };case 'FETCH_USER_SUCCESS':return { ...state, loading: false, user: action.payload, error: null };case 'FETCH_USER_FAILURE':return { ...state, loading: false, error: action.error };default:return state;}
};export default userReducer;

Action Creator 定义异步的 Action Creator:

const fetchUserData = (userId) => {return async (dispatch) => {dispatch({ type: 'FETCH_USER_REQUEST' });try {const response = await fetch(`https://jsonplaceholder.typicode.com/users/${userId}`);const data = await response.json();dispatch({ type: 'FETCH_USER_SUCCESS', payload: data });} catch (error) {dispatch({ type: 'FETCH_USER_FAILURE', error: error.message });}};
};

使用 Thunk 在 React 组件中使用异步 Action:

import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { fetchUserData } from './actions';const UserProfile = () => {const dispatch = useDispatch();const { loading, user, error } = useSelector((state) => state.user);useEffect(() => {dispatch(fetchUserData(1));}, [dispatch]);if (loading) return <div>Loading...</div>;if (error) return <div>Error: {error}</div>;return (<div><h1>{user.name}</h1><p>{user.email}</p></div>
  );
};export default UserProfile;

七、Redux Thunk vs Redux-Saga

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855304.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人车队运营需要的远程驾驶平台

无人车队在全时商业化运营的过程中,不可避免会出现自动驾驶无法处理的极端、异常场景。为提高运营效率,避免配备随车安全员带来的成本上升与风险增加,使用远程驾驶系统对无人车队运营进行辅助是较为经济且可靠的解决方案。经纬恒润远程驾驶系统具备丰富的功能和宽广的能力覆…

求职者必备:如何用管理软件实现高效的Offer规划

一、毕业季Offer规划的复杂性 毕业季的Offer规划不仅仅是简单的找工作过程,更是一次紧张的时间赛跑。从投递简历、面试安排、薪资谈判到最终的决定,整个过程充满了大量的任务和步骤。这些任务和环节涉及不同的公司、职位要求、面试形式以及其他各种变量。如果没有一个高效的工…

函数式接口之方法作为参数

在现实开发中,肯定会遇到这样一种情况,有几个业务场景,里面的大部分业务逻辑都一样,只有某些逻辑不同,而这些不同的逻辑又依赖于前面的逻辑,你会选择写重复代码去实现还是选择抽取公共方法,对那些不同的逻辑做单独处理?是不是理解起来比较抽象,简单就一句话,怎么把方…

胖东来成功背后的管理智慧:零售行业如何借鉴?

零售行业通过选择合适的看板软件、实施看板管理以及持续优化与改进等步骤,可以实现管理优化和效率提升。这将有助于企业更好地应对市场竞争、提高客户满意度和实现可持续发展。胖东来创始人于东来在社交平台分享了胖东来商贸集团2024年的营业情况。数据显示,截至2024年11月26…

旅游公司各部门联动,何种办公软件能高效协同?

在旅游行业蓬勃发展且竞争日益激烈的当下,高效的团队协作与个人学习效率提升成为旅游公司脱颖而出的关键因素。尤其是对于 MBTI 类型中倾向于有序规划的 J 人而言,可视化的团队协作办公软件犹如得力助手,能够让复杂的旅游业务流程清晰呈现,促进信息的高效流通与任务的顺利推…

linux操作系统安装

1.centenos镜像文件下载 2.创建一个虚拟机 1)打开VMware软件,选择创建新的虚拟机,在弹出的虚拟机向导的窗口选择自定义配置,点击下一步;2)默认设置3)选择稍后安装系统4)客户机操作系统选择Linux,版本选择CentOS 7(64位)5)命名虚拟机,选择存储路径6)处理器配置根据…

如何在宝塔面板中检查和开启path_info支持?

在宝塔面板中,检查和开启path_info支持的步骤如下:登录宝塔面板:打开浏览器,输入宝塔面板的地址(例如:http://你的域名:8888),使用管理员账号登录。进入网站管理页面:在宝塔面板首页,找到你需要配置的网站,点击“设置”按钮。进入PHP设置:在网站设置页面中,找到“…

大模型平台汇总说明

国外大模型平台 Openapi Anthropic Meta google国内大模型平台 百度 文心一言厂商 模型地址优势百度 文心一言 https://yiyan.baidu.com/ 支持文生图支持联网支持图生文支持读取文档支持生成图表商业信息查询生成思维导图 本文来自博客园,作者:王竹笙,转载请注明原文链接:…

规划新一年,提升效率:跨年日程管理与计划软件的完美结合

一、跨年日程规划的挑战 跨年作为时间的节点,往往意味着新的开始。许多人在这一时期都会进行新一年的规划,制定目标、任务和行动计划。无论是个人的生活规划,还是团队或公司的年度战略,跨年日程规划面临的挑战主要包括:1.1 任务繁多,易遗漏 跨年日程通常包含从目标设定、…

Angular 打包 ng build 不压缩混淆

`ng build` 后,`js` 代码被压缩混淆了,好像不太利于学习,何解?ng build 后,js 代码被压缩混淆了,好像不太利于学习,何解?无解??? 非也,非也。 试试 ng build --help, 何如?可解,可解。 Angular 微微抬头,语重心长曰:“小伙子,运行这个命令 —— ng build -c …

Kafka Streams 在监控场景的应用与实践

介绍 Kafka Streams 的原理架构,常见配置以及在监控场景的应用。作者:来自 vivo 互联网服务器团队- Pang Haiyun介绍 Kafka Streams 的原理架构,常见配置以及在监控场景的应用。 一、背景 在当今大数据时代,实时数据处理变得越来越重要,而监控数据的实时性和可靠性是监控能…

让.NET应用支持Http/3,QUIC协议

1. 必备条件 1.1 .NET应用开启https Programe.cs中配置了https支持, var builder = WebApplication.CreateBuilder(args);builder.WebHost.ConfigureKestrel((context, options) => {options.ListenAnyIP(5001, listenOptions =>{listenOptions.Protocols = HttpProtoco…