React-Redux学习笔记(自用)

news2025/2/26 7:21:38

1. 环境搭建

插件安装:Redux Toolkit和react-redux

npm i @reduxjs/toolkit react-redux

2、

store目录结构设计

  1. 集中状态管理的部分会单独创建一个store目录(在src下)
  2. 应用通常会有很多个子模块,所以还会有个modules目录,在内部编写业务分类的子store
  3. store中的入口文件index.js的作用是组合modules中的所有子模块,并导出store
    store目录结构

3、使用React Toolkit创建counterStore

创建各模块的store
counterStore.js

import { createSlice } from "@reduxjs/toolkit";

// 创建store
const counterStore = createSlice({
	name: 'counter',
	// 初始化state
	initialState: {
		count: 0
	},

	// 修改状态的方法 
	reducers: {
		inscrement(state) {
			state.count++;
		},
		decrement(state) {
			state.count--;
		}
	}
})


// 结构出actionCreater函数
const {inscrement, decrement} = counterStore.actions
// 获取reducer
const reducer = counterStore.reducer

// 以按需导出的方式导出actionCreater
export {inscrement, decrement}
// 以默认导出的方式导出reducer
export default reducer

在index,js中组合store

import { configureStore } from "@reduxjs/toolkit";
// 导入子模块reducer
import counterReducer from './modules/counterStore'


const store = configureStore({
    reducer: {
        counter: counterReducer
    }
})

export default store

4、为React注入store

React-redux负责把Redux和redux连接起来,内置Provider组件通过store参数把创建好的store实例注入到应用中。

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
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();

5、在React组件中使用store中的数据

使用useSelector钩子函数,把store中的数据映射到组件中


import React from 'react';
import './App.css';

import { useSelector } from 'react-redux';

function App() {
  // 这里state.counter和store中的reducer.counter是对应的
  const {count} = useSelector(state => state.counter);
  return (
    <React.Fragment>
      <div>
        {count}
      </div>
    </React.Fragment>
  );
}

export default App;

6、React组件中修改store中的数据

引入useDispatch钩子函数,作用:生成提交的action对象的dispatch函数


import React from 'react';
import './App.css';

import { useDispatch, useSelector } from 'react-redux';

// 倒入actionCreater
import {inscrement, decrement} from './store/modules/counterStore'

function App() {
  // 这里state.counter和store中的reducer.counter是对应的
  const {count} = useSelector(state => state.counter);
  const dispatch = useDispatch()

  return (
    <React.Fragment>
      <div>
        {/* 调用dispatch提交action对象 */}
        <button onClick={()=> dispatch(decrement())}> - </button>
        <span>
          {count}
        </span>
        <button onClick={() => dispatch(inscrement())}> + </button>
      </div>
    </React.Fragment>
  );
}

export default App;

7、在action中传参

在reducers的同步修改方法中添加action对象参数,在调用actionCreator时传递参数,参数会被传递到action对象的payload属性上
定义方法:通过payload获取传入的参数

import { createSlice } from "@reduxjs/toolkit";

// 创建store
const counterStore = createSlice({
	name: 'counter',
	// 初始化state
	initialState: {
		count: 0
	},

	// 修改状态的方法 
	reducers: {
		inscrement(state) {
			state.count++;
		},
		decrement(state) {
			state.count--;
		},
		addToNum (state, action) {
			// payload是固定属性
			state.count = action.payload
		}
	}
})


// 解构出actionCreater函数
const {inscrement, decrement, addToNum} = counterStore.actions
// 获取reducer
const reducer = counterStore.reducer

// 以按需导出的方式导出actionCreater
export {inscrement, decrement, addToNum}
// 以默认导出的方式导出reducer
export default reducer

使用

        <button onClick={() => dispatch(addToNum(10))}> add To 10</button>
        <button onClick={() => dispatch(addToNum(20))}> add To 20</button>

8、异步代码

  1. store写法不变
  2. 单独封装一个函数,返回一个新函数,在新函数中:封装异步请求获取数据,并调用同步actionCreater传入异步数据生成一个action对象,并使用dispatch提交
    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
		}
	}
})

// 异步请求部分
const {setChannels} = channelStore.actions

const fetchChannelList = () =>{
	return async (dispatch) => {
		const res = await axios.get('http://geek.itheima.net/v1_0/channels')
		dispatch(setChannels(res.data.data.channels))
	}
}

const reducer = channelStore.reducer
export {fetchChannelList}
export default reducer

  1. 组件中dispatch的写法保持不变
    store/index.js不变
import { configureStore } from "@reduxjs/toolkit";
// 导入子模块reducer
import counterReducer from './modules/counterStore'
import channelReducer from './modules/channelStore'

const store = configureStore({
    reducer: {
        counter: counterReducer,
        channel: channelReducer
    }
})  

export default store

在组件中使用

import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';

// 倒入actionCreater
import { fetchChannelList } from './store/modules/channelStore';

function App() {
  const {channelList} = useSelector(state => state.channel)
  const dispatch = useDispatch()
  useEffect(() => {
    dispatch(fetchChannelList())
  }, [])

  return (
    <React.Fragment>
      <div>
        {/* 调用dispatch提交action对象 */}
        <ul>
          {channelList.map(item => <li key={item.id}>{item.name}</li>)}
        </ul>
      </div>
    </React.Fragment>
  );
}

export default App;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

net start mysql服务名无效

问题背景 起因是我的电脑因为停电烧坏了系统固态硬盘&#xff0c;再新装系统后&#xff0c;之前的MySQL服务无法通过下面的命令启动。 net start mysql # 报错&#xff1a;服务名无效 报错&#xff1a;服务名无效 报错信息 未找到&#xff1a;在Windows服务中找不到MySQL 找…

【无线传感网】分簇路由算法介绍

目录 1、LEACH路由算法 2、PEGASIS 算法 3、TEEN 算法 5、APTEEN 5、LEACH-C 算法 无线传感网中的路由协议就是寻找一条路径让网络中节点沿着这条路径将数据信息传输出去。路由协议的两大关键要点就是路径的优化和数据的分组,在传统计算机网络中,是将网络的拓扑…

帝国cms批量取消文章审核-把已审核的文章改成未审核的方法

帝国cms很多人采集的时候,把文章弄成了审核过的文章,或者因为其他的原因,文章都是审核通过,为了seo又不能把全部文章放出来,所以需要把文章弄成未审核以下就是解决本问题的办法 首先来修改后台列表文件,自行找文件路径 第二步,增加函数 在ecmsinfo.php的150行后面增加…

中年帕金森:守护健康,从容面对生活挑战

在快节奏的现代生活中&#xff0c;中年人群面临着越来越多的健康挑战。其中&#xff0c;帕金森病作为一种常见的神经系统疾病&#xff0c;逐渐引起了人们的关注。帕金森病不仅影响患者的身体健康&#xff0c;还对其日常生活造成极大的困扰。那么&#xff0c;我们该如何应对中年…

协同编辑:只是在线协作这么简单吗?揭秘协同编辑的深层价值

经常很多朋友咨询&#xff0c;无忧企业文档是否支持协同编辑&#xff0c;首先肯定是支持的。但是&#xff0c;我发现很多人对于“协同编辑”的理解可能比较表面&#xff0c;仅仅停留在多人同时编辑一份文档的层面。实际上&#xff0c;协同编辑的功能远不止于此&#xff0c;它更…

【Java】BigDecimal类型——BigDecimal 为什么可以保证精度不丢失

目录 简介类介绍案例分析总结BigDecimal类型的使用场景MySQL中存储BigDecimal类型数据补充&#xff1a;BigDecimal类型使用时的注意事项BigDecimal类型的其他使用 简介 BigDecimal是Java中的一个类&#xff0c;用于处理大数运算。它提供了精确的数值计算&#xff0c;可以处理任…

51单片机STC89C52RC——2.3 两个独立按键模拟控制LED流水灯方向

目的 按下K1键LED流水向左移动 按下K2键LED流水向右移动 一&#xff0c;STC单片机模块 二&#xff0c;独立按键 2.1 独立按键位置 2.2 独立按键电路图 这里要注意一个设计的bug P3_1 引脚对应是K1 P3_0 引脚对应是K2 要实现按一下点亮、再按一下熄灭&#xff0c;我们就需…

『Z-Weekly Feed 08』加密资产观 | FHE应用前景 | OPAL协议

一位机构投资者的加密资产观 作者&#xff1a;Hongbo 01 &#x1f4a1;TL;DR 在加密投资领域如何找到真正的“价值”&#xff1a;Crypto 作为一种新兴资产&#xff0c;应该找到一种区别于传统公司股票资产的估值方法&#xff0c;本文重点阐述了加密货币作为新的资产类型与传统资…

北京健康检测小程序开发,爱自己,从体检开始

随着经济与科技的不断发展&#xff0c;人们也越来越重视自身的身体健康。面对市面上众多的体检机构与五花八门的体检产品&#xff0c;人们往往没有充足的时间进行筛选&#xff0c;好不容易选好了医院、但进行单项体检的价格较高&#xff0c;选择套餐&#xff0c;又包含了一些不…

Codeforces Round 953 (Div.2)

传送门 A. Alice and Books 时间限制&#xff1a;1秒 空间限制&#xff1a;256MB 输入&#xff1a;标准输入 输出&#xff1a;标准输出 题目描述 Alice 有 n 本书。第 1 本书有 页&#xff0c;第 2 本书有 页&#xff0c;依此类推&#xff0c;第n本…

c库函数:strrchr使用demo案例

1. strrchr库函数说明 头文件 <string.h> 函数形式 char *strrchr( const char *str, int ch ); 功能 在str所指向的空终止字节串中寻找字符ch的最后出现。 参数 str - 指向要分析的空终止字节字符串的指针 ch - 要搜索的字符 返回值 指向 str 中找到的字符的…

【Docker安装】Ubuntu系统下部署Docker环境

【Docker安装】Ubuntu系统下部署Docker环境 前言一、本次实践介绍1.1 本次实践规划1.2 本次实践简介二、检查本地环境2.1 检查操作系统版本2.2 检查内核版本2.3 更新软件源三、卸载Docker四、部署Docker环境4.1 安装Docker4.2 检查Docker版本4.3 配置Docker镜像加速4.4 启动Doc…

关于车规级功率器件热可靠性测试的分享

随着中国电动汽车市场的稳步快速发展和各大车企布局新能源的扩散&#xff0c;推动了车规级功率器件的快速增长。新能源汽车行业和消费电子都会用到半导体芯片&#xff0c;但车规级芯片对外部环境要求很高&#xff0c;涉及到的一致性和可靠性均要大于工业级产品要求&#xff0c;…

优化改进YOLOv5算法之Shift-ConvNets,具有大核效应的小卷积核,效果提升明显

目录 1 Shift-ConvNets模块原理 1.1 Decomposition and Combination of Convolution 1.2 Sparse Dependencies of Large Convolution Kernels 1.3 Intermodule Feature Manipulation 2 YOLOv5中加入Shift-ConvNets模块 2.1 common.py文件配置 2.2 yolo.py配置 2.3 创建…

龙讯旷腾PWmat计算vdW异质结中热载流子冷却 | 复刻《Phys. Chem. Chem. Phys 》文献

01 NAMD 背景介绍 在各类光物理与光化学过程当中&#xff0c;均会牵涉到激发态载流子动力学过程&#xff0c;诸如电荷弛豫、复合以及输运等等。光激发或者电子注入将初始的平衡状态打破&#xff0c;所产生的热载流子在其演化进程中&#xff0c;会与原子核产生强烈耦合。此时&a…

Elsevier曝光73篇论文操纵同行评审,涉嫌操纵同行评审和人为引用

近日&#xff0c;全球知名学术出版商爱思唯尔&#xff08;Elsevier&#xff09;旗下期刊《Engineering Analysis with Boundary Elements》对73篇论文发出了关注声明&#xff0c;这些论文涉嫌操纵同行评审和人为引用。去年7月&#xff0c;该期刊前编委Masoud Afrand被指涉嫌论文…

OceanBase v4.2 特性解析:支持并发建表,提升OMS导入效率

背景 OceanBase 4.0版本新增了单日志流架构&#xff0c;使得OBServer单机突破了原有的分区数限制&#xff0c;支持更大数量的分区。 很多业务环境为了处理单机数据量过大的问题&#xff0c;通常采取分库分表的方法&#xff0c;这一方法会导致业务需要创建数十万乃至百万级别的…

电网铁塔安全:输电线路智能螺栓在线监测装置|远程了解螺栓异常情况

电网铁塔安全&#xff1a;输电线路智能螺栓在线监测装置|远程了解螺栓异常情况 在浩渺的天空下&#xff0c;银线如织&#xff0c;纵横交错&#xff0c;那是我们的输电线路&#xff0c;是点亮万家灯火的血脉。然而&#xff0c;这看似坚强的网络&#xff0c;实则也隐藏着许多不为…

新港海岸NCS8801 RGBLVDS转DPEDP,支持4K60HZ,成熟方案大批量出货产品,国产化认证

NCS8801描述&#xff1a; NCS8801S是一种低功耗的RGB/LVDS到显示端口/eDP转换器&#xff0c;专为智能手机、平板电脑、笔记本电脑等移动设备而设计。以支持高清DP/eDP显示器。NCS8801S支持4车道DP/eDP输出&#xff0c;这通常需要以60Hz的帧率支持QXGA&#xff08;2048*1536&am…

数据可视化作业二:中国城市地铁数据可视化

目录 作业要求 一、绘制每个城市站点数量柱状图&#xff08;降序排列&#xff09; 1.1 每个城市站点数量统计 1.1.1 代码展示 1.1.2 统计结果展示 1.2 柱状图绘制 1.2.1 代码实现 1.2.2 绘制结果 二、绘制上海市地铁线路站点数饼状图 2.1 数据处理 2.2 代码实现 2.3…