详细介绍 React 中如何使用 redux
在使用之前要先了解它的配套插件:
在React中使用redux,官方要求安装其他插件 Redux Toolkit 和 react-redux
-
Redux Toolkit:它是一个官方推荐的工具集,旨在简化 Redux 的使用和管理。Redux Toolkit 提供了一些提高开发效率的工具和功能,如
createSlice和configureStore,使得编写和组织 Redux 代码更加简单。使用 Redux Toolkit,您可以更快地编写 Redux 代码,同时还能获得一些性能优化和开发便利。安装 Redux Toolkit:
npm install @reduxjs/toolkit
-
react-redux:它是 Redux 官方提供的与 React 集成的库。它提供了
Provider组件来将 Redux store 注入到整个 React 应用中,以及useDispatch和useSelector这些方便的钩子函数,用于在 React 组件中使用 Redux 的 dispatch 和选择器功能。安装 react-redux:
npm install react-redux
安装这两个插件后,您就可以在 React 应用中使用 Redux 并使用 Redux Toolkit 进行更简洁、高效的编码,同时通过 react-redux 方便地与 React 进行集成。
创建一个新的react 文件,且安装了两个插件后,调整目录结构

开始使用:
第一步:初始化 state,定义修改状态的方法,解构出来 actionCreater函数,获取 reducer
reducer 用于定义如何更新应用的状态。它接收两个参数:当前的状态(state)和即将执行的 action,并返回一个新的状态。
counterStore.js
import { createSlice } from "@reduxjs/toolkit";const counterStore = createSlice({name: "counter",// 初始化 stateinitialState: {count: 0,},// 修改状态的方法 同步方法,可以直接修改值reducers: {addCount(state) {state.count++;},decreaseCount(state) {state.count--;},},
});// 解构出来 actionCreater函数
const { addCount, decreaseCount } = counterStore.actions;
// 获取 reducer
const reducer = counterStore.reducer;
// 按需导出
export { addCount, decreaseCount };
// 默认导出
export default reducer;
第二步:在出口文件中导出 redux
src\store\index.js
// 出口文件
import { configureStore } from "@reduxjs/toolkit";
// 导入子模块
import counterStore from "./modules/counterStore";const store = configureStore({reducer: {counter: counterStore,},
});// 导出
export default store;
第三步:配置redux 中的数据全局可用
src\index.js
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
// Redux
import store from "./store";
import { Provider } from "react-redux";const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<React.StrictMode>{/* 全局可用 */}<Provider store={store}><App /></Provider></React.StrictMode>
);reportWebVitals();
第四步:使用
useDispatch:它简化了在函数组件中使用 dispatch 函数的过程,无需手动从 store 中获取 dispatch 函数。
useSelector:它允许组件从 Redux store 中选择(select)所需的状态。通过它可以订阅 Redux store 的状态,以便在组件中获取所需的数据。
App.js
import "./App.css";
import { useDispatch, useSelector } from "react-redux";
// 获取
import { addCount, decreaseCount } from "./store/modules/counterStore";function App() {// 得到 Redux 中的数据const { count } = useSelector((state) => state.counter);// 处理数据的函数const dispatch = useDispatch();return (<div className="App"><button onClick={() => dispatch(addCount())}>+</button><p>{count}</p><button onClick={() => dispatch(decreaseCount())}>-</button></div>);
}export default App;
携带参数
// 接收传参addTonum(state, action) {// action.payload 可以获取到传入的参数state.count = action.payload;},
import { createSlice } from "@reduxjs/toolkit";const counterStore = createSlice({name: "counter",// 初始化 stateinitialState: {count: 0,},// 修改状态的方法 同步方法,可以直接修改值reducers: {addCount(state) {state.count++;},decreaseCount(state) {state.count--;},// 接收传参addTonum(state, action) {// action.payload 可以获取到传入的参数state.count = action.payload;},},
});// 解构出来 actionCreater函数
const { addCount, decreaseCount, addTonum } = counterStore.actions;
// 获取 reducer
// 用于定义如何更新应用的状态。它接收两个参数:当前的状态(state)和即将执行的 action,并返回一个新的状态。
const reducer = counterStore.reducer;// 按需导出
export { addCount, decreaseCount, addTonum };
// 默认导出
export default reducer;
App.js
<button onClick={() => dispatch(addTonum(10))}>+10</button><button onClick={() => dispatch(addTonum(20))}>+20</button>
异步请求部分
异步封装的实现
1.创建store的写法保持不变,配置好同步修改状态的方法
2.单独封装一个函数,在函数内部return一个新函数,在新函数中
2.1封装异步请求获取数据
2.2调用同步actionCreater传入异步数据生成一个action对象,并使用dispatch提交
3.组件中dispatch的写法保持不变
src\store\modules\channelStore.js
// 异步封装的实现
import { createSlice } from "@reduxjs/toolkit";
import axios from "axios";const channelStore = createSlice({name: "channel",// 初始值initialState: {channelList: [],},reducers: {setChannels(state, action) {state.channelList = action.payload;},},
});// 异步请求部分
// http://geek.itheima.net/v1_0/channels
const { setChannels } = channelStore.actions;const fetchChannlList = () => {return async (dispatch) => {const res = await axios.get("http://geek.itheima.net/v1_0/channels");dispatch(setChannels(res.data.data.channels));};
};export { fetchChannlList };const reducer = channelStore.reducer;
export default reducer;
出口文件
src\store\index.js
// 出口文件
import { configureStore } from "@reduxjs/toolkit";
// 导入子模块
import counterStore from "./modules/counterStore";
import channelStore from "./modules/channelStore";const store = configureStore({reducer: {counter: counterStore,channel: channelStore,},
});// 导出
export default store;
使用
App.js
import "./App.css";
import { useEffect } from "react";import { useDispatch, useSelector } from "react-redux";
// 获取
import {addCount,decreaseCount,addTonum,
} from "./store/modules/counterStore";
import { fetchChannlList } from "./store/modules/channelStore";function App() {// 得到 Redux 中的数据const { count } = useSelector((state) => state.counter);const { channelList } = useSelector((state) => state.channel);// 处理数据的函数const dispatch = useDispatch();// 挂载渲染useEffect(() => {dispatch(fetchChannlList());}, [dispatch]);return (<div className="App"><button onClick={() => dispatch(addCount())}>+</button><p>{count}</p><button onClick={() => dispatch(decreaseCount())}>-</button><hr />{/* redux 传入参数 */}<button onClick={() => dispatch(addTonum(10))}>+10</button><button onClick={() => dispatch(addTonum(20))}>+20</button><hr />{/* 异步 */}<ul>{channelList.map((item) => (<li key={item.id}>{item.name}</li>))}</ul></div>);
}export default App;
浏览器插件,管理 redux
Redux DevTools
相关文章:
详细介绍 React 中如何使用 redux
在使用之前要先了解它的配套插件: 在React中使用redux,官方要求安装其他插件 Redux Toolkit 和 react-redux Redux Toolkit:它是一个官方推荐的工具集,旨在简化 Redux 的使用和管理。Redux Toolkit 提供了一些提高开发效率的工具…...
VLOOKUP多条件查询
LOOKUP(1,0/((A3:A15A18)*(C3:C15C18)),F3:F15)...
分页插件Mybatis
<plugins><!-- com.github.pagehelper为PageHelper类所在包名 --><plugin interceptor"com.github.pagehelper.PageInterceptor"><!-- 配置方言:告诉分页插件使用底层数据库是什么--><property name"helperDialect" value"…...
AXI协议之AXILite开发设计(四)—Block Design使用
微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 2、AXI interconnect互联组件的使用…...
音视频——帧内预测
H264编码(帧内预测) 在帧内预测模式中,预测块P是基于已编码重建块和当前块形成的。对亮度像素而言,P块用于44子块或者1616宏块的相关操作。44亮度子块有9种可选预测模式,独立预测每一个44亮度子块,适用于带有大量细节的图像编码&…...
2.uni-app项目文件
uni-app像是vue与微信小程序的合体,使用 uni-ui项目 模板创建的项目文件如下 目录 1 pages 2 pages.json 3 App.vue 4 index.html 5 static 6 uni_modules 7 manifest.json 8 main.js 9 uni.scss 1 pages 这个是放页面的,默认里面有…...
JavaScript学习 -- 对称加密算法DES
在现代的互联网时代,数据安全性备受关注。为了保护敏感数据的机密性,对称加密算法是一种常用的方法。在JavaScript中,DES(Data Encryption Standard)是一种常用的对称加密算法。本篇博客将为您展示如何在JavaScript中使…...
【Python数据分析】Python常用内置函数(二)
🎉欢迎来到Python专栏~Python常用内置函数(二) ☆* o(≧▽≦)o *☆嗨~我是小夏与酒🍹 ✨博客主页:小夏与酒的博客 🎈该系列文章专栏:Python学习专栏 文章作者技术和水平有限,如果文…...
Api接口出现Required request body is missing的解决方法
目录 1.问题所示2.原理分析3.解决方法1.问题所示 在使用PostMan 测试接口的时候,出现如下问题: {"code": 400,"success": false,"data": {},"msg":...
【Kaggle】Kaggle数据集如何使用命令语句下载?
一、Kaggle数据集如何下载 1.1 问题的起因 最近看到了 Google 组织的 Kaggle 比赛,想自己试一下,但是数据集太大了,将近有370G的数据。直接下载的话,网速太慢,可能要下载3-4天,所以萌生了用命令语句下载的…...
android pdf框架,编译mupdf
因为mupdf编译的体积不小,之前也发过编译的文章,现在更新一下. 建一个mupdf_c目录,名字自己取,在里面git下载mupdf源码,把目录修改为libmupdf mupdf_c目录下建build.gradle文件,内容如下 apply plugin: com.android.library apply plugin: maven-publishgroup com.artifex.…...
线性表详细讲解
2.1 线性表的定义和特点2.2 案例引入2.3 线程表的类型定义2.4 线性表的顺序表示和实现2.4.1 线性表的顺序存储表示2.4.2 线性表的结构类型定义2.4.3 顺序表基本操作的实现2.4.4 顺序表总结 2.5 线性表的链式表示和实现2.5.1 线性表的链式存储表示2.5.2 单链表的实现(…...
代码随想录算法训练营day45
文章目录 Day45爬楼梯题目思路代码 零钱兑换题目思路代码 完全平方数题目思路代码 Day45 爬楼梯 70. 爬楼梯 - 力扣(LeetCode) 题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢…...
机器学习深度学习——softmax回归(上)
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——线性回归的简洁实现 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所…...
基于express调用chatgpt文字流输出和有道智云语音合成
express是基于node.js的一个web框架,可以更加简洁的去创建一个后台服务,由于项目的需要,引入和typescript,经过几天的努力实现了chatgpt文字流输出有道智云语音合成的结合(略有遗憾),下面我记载…...
(学习笔记-内存管理)内存分段、分页、管理与布局
内存分段 程序是由若干个逻辑分段组成的,比如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段的形式把这些分段分离出来。 分段机制下,虚拟地址和物理地址是如何映射的? 分段机制下的虚拟地址由…...
PHP使用Redis实战实录1:宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案
宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案 前言一、Redis安装部署1.安装Redis2.php安装Redis扩展3.启动Redis 二、避坑指南1.6379端口配置2.Redis服务启动(1)Redis服务启动失败(2)Redis启动日志排查(3&a…...
【数据结构】这堆是什么
目录 1.二叉树的顺序结构 2.堆的概念及结构 3.堆的实现 3.1 向上调整算法与向下调整算法 3.2 堆的创建 3.3 建堆的空间复杂度 3.4 堆的插入 3.5 堆的删除 3.6 堆的代码的实现 4.堆的应用 4.1 堆排序 4.2 TOP-K问题 首先,堆是一种数据结构,一种特…...
FFmpeg 音视频开发工具
目录 FFmpeg 下载与安装 ffmpeg 使用快速入门 ffplay 使用快速入门 FFmpeg 全套下载与安装 1、FFmpeg 是处理音频、视频、字幕和相关元数据等多媒体内容的库和工具的集合。一个完整的跨平台解决方案,用于录制、转换和流式传输音频和视频。 官网:http…...
Go 语言 select 都能做什么?
原文链接: Go 语言 select 都能做什么? 在 Go 语言中,select 是一个关键字,用于监听和 channel 有关的 IO 操作。 通过 select 语句,我们可以同时监听多个 channel,并在其中任意一个 channel 就绪时进行相…...
别再只跑模型了!用FAD、NDB、JSD给你的AI生成声音打个分(Python实战避坑)
用FAD、NDB、JSD给你的AI生成声音打个分(Python实战避坑指南)当你在深夜终于调试完最后一个神经网络层,按下生成按钮听到第一段AI合成的声音时,那种成就感无与伦比。但很快,一个更棘手的问题出现了:这段声音…...
为ClaudeCode配置Taotoken作为稳定后备API服务避免中断
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为ClaudeCode配置Taotoken作为稳定后备API服务避免中断 基础教程类,针对担心Claude Code服务不稳定或配额不足的用户&a…...
一个简单的MCP代码示例
MCP项目测试示例from fastmcp import FastMCP# 1. 创建 MCP 服务器实例 mcp FastMCP("MyFirstServer")# 2. 定义一个工具(Tool):AI 可以调用的函数 mcp.tool() def add(a: int, b: int) -> int:"""将两个数字相…...
Linux 服务器安装 CC Switch GUI 工具 + VNC 远程桌面完整教程
Linux 服务器安装 CC Switch GUI 工具 VNC 远程桌面完整教程 前言 CC Switch 是一款 All-in-One 的 AI 助手启动器,集成了 Claude Code、Codex 和 Gemini CLI 等工具。但它是 GTK 图形界面程序,在无桌面环境的 Linux 服务器上直接运行会报错ÿ…...
30岁之后IT人士(程序员)的职业规划是什么呢?
前段也看到ibm的寇卫东的一篇文章关于职业规划的,现在看看,这些职业规划都是理想状态下的产物,很多时候,限于我们自身水平、时间、空间的影响,很多是看着很美,其实却远远的达不到,不能仅仅说让人…...
甲言Jiayan:5分钟掌握古汉语NLP终极解决方案
甲言Jiayan:5分钟掌握古汉语NLP终极解决方案 【免费下载链接】Jiayan 甲言,专注于古代汉语(古汉语/古文/文言文/文言)处理的NLP工具包,支持文言词库构建、分词、词性标注、断句和标点。Jiayan, the 1st NLP toolkit designed for Classical C…...
Wireshark进阶实战:15分钟定位真实网络故障根因
1. 这不是“又一个Wireshark教程”,而是我三年里修过的27个真实网络故障现场 你打开Wireshark,看到满屏滚动的TCP、HTTP、DNS包,心里发虚——不是不会点“开始捕获”,而是根本不知道该盯哪一行、为什么这一行比那一行重要、哪个字…...
3分钟实现网页图片格式自由转换:Chrome扩展终极指南
3分钟实现网页图片格式自由转换:Chrome扩展终极指南 【免费下载链接】Save-Image-as-Type Save Image as Type is an chrome extension which add Save as PNG / JPG / WebP to the context menu of image. 项目地址: https://gitcode.com/gh_mirrors/sa/Save-Ima…...
终极指南:如何用Pocket Sync轻松管理Analogue Pocket游戏设备
终极指南:如何用Pocket Sync轻松管理Analogue Pocket游戏设备 【免费下载链接】pocket-sync A GUI tool (Mac, Windows, Linux) for doing stuff with the Analogue Pocket 项目地址: https://gitcode.com/gh_mirrors/po/pocket-sync Pocket Sync是一款专为A…...
ViGEmBus虚拟手柄驱动深度解析与实战指南
ViGEmBus虚拟手柄驱动深度解析与实战指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过这样的困境:手头有一款独特的游戏控制…...
