react(9)-redux

embedded/2025/2/23 2:19:40/

使用CRA快速创建react项目 

npx create-react-app react-redux

安装配套工具

npm i @reduxjs/toolkit react-redux

启动项目

在创建项目时候会出现一个问题 

You are running `create-react-app` 5.0.0, which is behind the latest release (5.0.1).

We no longer support global installation of Create React App.

Please remove any global installs with one of the following commands:

- npm uninstall -g create-react-app
- yarn global remove create-react-app

The latest instructions for creating a new app can be found here:

解决办法

 卸载全局安装的create-react-app

javascript">npm uninstall -g create-react-app
npx clear-npx-cache
npm i create-react-app
npx create-react-app@latest xxxxx项目名

案例:

创建store文件夹

使用store数据和方法的基本步骤

1、引入import { createSlice } from "@reduxjs/toolkit";

初始化值

  //初始化state

javascript">  initialState: {count: 0},

创建使用方法

javascript">  // 修改状态的方法 同步方法 支持直接修改reducers: {increment: state => {state.count += 1;},decrement: state => {state.count -= 1;}}

解构导出

javascript">// 导出actions和reducers
const { increment, decrement } = counterStore.actions;
const  reducer  = counterStore.reducer;
// 按需导出
export { increment, decrement }; 
// 默认导出
export default reducer;

整体

javascript">import { createSlice } from "@reduxjs/toolkit";const counterStore = createSlice({name: "counter",//初始化stateinitialState: {count: 0,},// 修改状态的方法 同步方法 支持直接修改reducers: {increment: (state) => {state.count += 1;},decrement: (state) => {state.count -= 1;},},
});
// 结构counterStore// 导出actions和reducers
const { increment, decrement } = counterStore.actions;
const reducer = counterStore.reducer;
// 按需导出
export { increment, decrement };
// 默认导出
export default reducer;

2、在index文件中使用

javascript">import { configureStore } from "@reduxjs/toolkit";
import counterReducer from "./modules/counterStore";
const store=configureStore({reducer: {counter: counterReducer}
});
export default store;

3、index文件中添加 Provider

javascript">import { Provider } from 'react-redux';
import store from './store';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<React.StrictMode><Provider store={store}><App /></Provider></React.StrictMode>
);

4、APP.js文件

javascript">import { useDispatch,useSelector } from "react-redux";
import { decrement,increment } from "./store/modules/counterStore";function App() {const {count}= useSelector(state=>state.counter)const dispatch= useDispatch()return (<div className="App"><button onClick={()=>dispatch(decrement())}>-</button>{count}<button onClick={()=>dispatch(increment())}>+</button></div>);
}export default App;

5 传参的写法  

javascript"> addToNum(state, action) {state.count += action.payload;}

不要忘记两个地方的导出

使用

javascript"> <button onClick={()=>dispatch(addToNum(20))}>+</button>

案例2  异步获取数据

channenStore.js文件

javascript">import { createSlice } from "@reduxjs/toolkit";
import axios from "axios";
// 创建store数据
const channelStore = createSlice({name: "channel",initialState: {channelList: [],},// 修改状态的方法reducers: {setChanles(state, action) {state.channelList = action.payload;},},
});
// 导出actions和reducers
const { setChanles } = channelStore.actions;
const reducer = channelStore.reducer;
// 异步请求部分
const fetchChannlList = () => {return async (dispatch) => {const res = await axios.get("http://geek.itheima.net/v1_0/channels");dispatch(setChanles(res.data.data.channels));};
};
export { fetchChannlList };
export default reducer;

store的index文件 

javascript">import { configureStore } from "@reduxjs/toolkit";
import counterReducer from "./modules/counterStore";
import channelReducer from "./modules/channelStore";
const store=configureStore({reducer: {counter: counterReducer,channel: channelReducer}
});
export default store;

触发

javascript">import { useDispatch, useSelector } from "react-redux";
import { decrement, increment, addToNum } from "./store/modules/counterStore";
// 引入异步函数 channelStore的函数方法
import { fetchChannlList } from "./store/modules/channelStore";
import { useEffect } from "react";function App() {const { count } = useSelector((state) => state.counter);
// 获取channelListconst { channelList } = useSelector((state) => state.channel);const dispatch = useDispatch();// 触发异步函数useEffect(() => {dispatch(fetchChannlList())},[dispatch])return (<div className="App"><button onClick={() => dispatch(decrement())}>-</button>{count}<button onClick={() => dispatch(increment())}>+</button><button onClick={() => dispatch(addToNum(20))}>+</button>{/* 列表展示 */}<ul>{channelList.map((item) => (<li key={item.id}>{item.name}</li>))}</ul></div>);
}export default App;


http://www.ppmy.cn/embedded/164505.html

相关文章

芯麦GC1808立体声ADC芯片解析:高性价比与全集成音频采集方案

引言 在直播设备、智能语音终端等新兴应用的推动下&#xff0c;高性能音频采集系统的需求持续增长。芯麦半导体推出的GC1808立体声音频模数转换器&#xff0c;凭借其全集成信号链设计和灵活的接口配置&#xff0c;为开发者提供了高性价比的音频前端解决方案。本文将从核心架构…

(萌新入门)如何从起步阶段开始学习STM32 —— 1如何迁移一个开发版的工程

目录 前言 如何迁移一个开发版的工程到其他单片机上&#xff1f; Step 1&#xff1a;明确你单片机的型号 STEP2 确定环境后移植代码 提示&#xff1a;正常而言&#xff0c;我们是使用的套模板建立工程 提示&#xff1a;笔者自身不使用这些模板&#xff0c;我是使用CubeMX快…

一键提取人声 、伴奏 免费人声、伴奏 音频分离软件分享——UVR5下载安装教程

引言 在处理视频及音频编辑的过程中&#xff0c;人声与伴奏的分离是一项广受欢迎且实用的功能&#xff0c; 但是市面上大多人声分离软件都需付费。今天要分享的是Ultimate Vocal Remover 5 (UVR5)&#xff0c;一款跨平台&#xff08;Windows、Mac、Linux&#xff09;的专业音频…

Java数据结构第十二期:走进二叉树的奇妙世界(一)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、树型结构 1.1. 树的定义 1.2. 树的基本概念 1.3. 树的表示形式 二、二叉树 2.1. 概念 2.2. 两种特殊的二叉树 2.3. 二叉树的性质 2.4. 二叉树的存储 三、二叉树的基本操作 一、树型结构 1.…

一周学会Flask3 Python Web开发-request请求对象与url传参

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili request请求对象封装了从客户端发来的请求报文信息&#xff0c;我们可以从中获取所有数据。 request对象包含的常用属性&…

DeepSeek-学习与实践

1.应用场景 主要用于学习与使用DeepSeek解决问题, 提高效率. 2.学习/操作 1.文档阅读 文档 DeepSeek -- 官网, 直接使用 --- 代理网站 --- 极客智坊 https://poe.com/DeepSeek-R1 https://time.geekbang.com/search?qdeepseek -- 搜索deepseek的资料 资料 20250209DeepSeekC…

LVS-nat模式

(a). 当用户请求到达 Director Server &#xff0c;此时请求的数据报文会先到内核空间的 PREROUTING 链。 此时报 文的源 IP 为 CIP &#xff0c;目标 IP 为 VIP (b). PREROUTING 检查发现数据包的目标 IP 是本机&#xff0c;将数据包送至 INPUT 链 (c). IPVS 比对数据包请…

海外企业真的需要跨境专线网络吗?

你好&#xff01;在当今快速发展的全球市场中&#xff0c;外贸企业面临着日益严格的网络需求与挑战。随着国际贸易的扩大&#xff0c;企业需要一种高效的网络解决方案来提升国际沟通的效率和数据传输的安全性。本文将深入探讨外贸企业在选择跨境网络专线方面的必要性&#xff0…