React-Redux学习笔记(自用)

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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贴图法美化Button按钮

贴图法美化Button按钮 项目是在下面这篇文章里的基础上进行美化的&#xff1a;MFC实现INI配置文件的读取 1. 初始效果 2.最终效果 3. 增加 CImgButton 类 1.1 ImgButton.h 头文件 #pragma once // CImgButtonclass CImgButton : public CBitmapButton {DECLARE_DYNAMIC(CImgBu…

偏微分方程算法之抛物型方程差分格式编程示例四(Richardson外推)

目录 一、研究问题 二、C++代码 三、结果分析 一、研究问题 已知其精确解为。分别取以下三种步长: ①

6.19 作业

QT实现TCP服务器 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer>//服务器类 #include<QMessageBox>//消息对话框类 #include<QTcpSocket>//客户端的类 #include<QList>//链表容器类QT_BEGIN_NAMESPACE nam…

PHP安装配置

文章目录 1.下载PHP2.配置环境变量3.Apache安装配置 1.下载PHP PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法…

PFA镊子有无固定支柱尖头扁头规格厂家可定制

PFA镊子&#xff0c;特氟龙镊子&#xff0c;聚四氟乙烯镊子&#xff0c;耐腐蚀耐高温 PFA镊子用于夹取小型片状、薄状、块状样品&#xff0c;广泛应用在半导体、新材料、新能源、原子能、石油化工、无线电、电力机械等行业。 具有耐高低温性&#xff08;可使用温度-200℃&#…

Hedra:让您的照片说话

在数字内容创作的世界里&#xff0c;我们总是在寻找那些能够让我们的作品更加生动和吸引人的工具。Hedra软件就是这样一款工具&#xff0c;它能够让您的照片动起来&#xff0c;甚至说话。想象一下&#xff0c;您的家庭相册中的照片突然变得栩栩如生&#xff0c;或者您的产品图片…

Git/TortoiseGit ssh client 配置

1. Git ssh client 配置 Git 默认的 ssh client 是 <Git 安装目录>/usr/bin/ssh.exe 修改方法为打开 Git Bash 执行&#xff1a; git config --global core.sshCommand "/C/Program Files/TortoiseGit/bin/TortoiseGitPlink.exe" 注意&#xff1a;如果路径…

Word 文本框技巧2则

1 调整大小 一种方法是&#xff0c;选中文本框&#xff0c;周围出现锚点&#xff0c;然后用鼠标拖动来调整大小&#xff1b; 精确按数值调整&#xff0c;在 格式 菜单下有多个分栏&#xff0c;一般最后一个分栏是 大小 &#xff1b;在此输入高度和宽度的数值&#xff0c;来调整…

深度学习算法informer(时序预测)(二)(Encoder)

一、EncoderLayer架构如图&#xff08;不改变输入形状&#xff09; 二、ConvLayer架构如图&#xff08;输入形状中特征维度减半&#xff09; 三、Encoder整体 包括三部分 1. 多层EncoderLayer 2. 多层ConvLayer 3. 层归一化 代码如下 class AttentionLayer(nn.Module):de…

Representation RL:HarmonyDream: Task Harmonization Inside World Models

ICML2024 paper code Intro 基于状态表征的model-based强化学习方法一般需要学习状态转移模型以及奖励模型。现有方法都是将二者联合训练但普遍缺乏对如何平衡二者之间的比重进行研究。本文提出的HarmonyDream便是通过自动调整损失系数来维持任务间的和谐&#xff0c;即在世界…

【51单片机基础教程】点亮led

文章目录 前言51单片机点亮LED的原理硬件部分软件部分51单片机的寄存器编程步骤proteus仿真点亮一个led 点亮多个ledproteus仿真代码 流水灯 总结 前言 单片机&#xff08;Microcontroller Unit, MCU&#xff09;是一种集成电路&#xff0c;广泛应用于各种电子产品中。作为嵌入…

Palo Alto GlobalProtect App 6.3 (macOS, Linux, Windows, Andriod) - 端点网络安全客户端

Palo Alto GlobalProtect App 6.3 (macOS, Linux, Windows, Andriod) - 端点网络安全客户端 Palo Alto Networks 远程访问 VPN 客户端软件 请访问原文链接&#xff1a;https://sysin.org/blog/globalprotect-6/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。…

HotSpot 垃圾收集器

文章目录 前言HotSpot 垃圾收集器1. 查看jdk默认垃圾收集器命令2. 查看当前服务使用的是哪个垃圾收集器:3. 常用的垃圾收集器3.1. 并行垃圾收集器&#xff08;Parallel Garbage Collector&#xff09;3.2. CMS 垃圾收集器&#xff08;Concurrent Mark-Sweep Garbage Collector&…

ubuntu16.04升级cmake版本至3.21.0

ubuntu16.04升级cmake版本至3.21.1 前言&#xff1a;建议先看完文章&#xff0c;再逐步跟做。 相对来说。ubuntu16.04是比较稳定一版&#xff0c;但其默认安装的cmake版本是3.5.1&#xff0c;假如我们需要用到更高的cmake版本&#xff0c;则需要手动升级cmake版本号。以cmake3.…

智能体「自我进化」全流程--AgentGym

AI通用智能体的自我进化能力&#xff0c;并非遥不可及。基于大语言模型的智能体已经不再需要人类监督者的帮助&#xff0c;开始实现「自我进化」&#xff01;这个智能体在学习了专家轨迹以后&#xff0c;获得了基础的通用能力&#xff0c;能够在更广泛、更真实的未知环境与任务…

最新Sublime Text软件安装包分享(汉化版本)

Sublime Text 是一款广受欢迎的跨平台文本编辑器&#xff0c;专为代码、标记和散文编辑而设计。它以其简洁的用户界面、强大的功能和高性能而著称&#xff0c;深受开发者和写作者的喜爱。 一、下载地址 链接&#xff1a;https://pan.baidu.com/s/1kErSkvc7WnML7fljQZlcOg?pwdk…

STM32单片机-PWR电源控制和WDG看门狗

STM32单片机-PWR电源控制和WDG看门狗 一、PWR简介二、低功耗模式三、修改主频&睡眠模式&停机模式&待机模式3.1 修改主频3.2 睡眠模式3.3 停机模式3.4 待机模式 四、WDG简介4.1 独立看门狗原理4.2 窗口看门狗原理4.3 IWDG和WWDG对比 五、独立看门狗&窗口看门狗5…

超导托卡马克主要用于可控核聚变领域 我国企业具备高性能产品自主研发实力

超导托卡马克主要用于可控核聚变领域 我国企业具备高性能产品自主研发实力 超导托卡马克又称半超导托卡马克&#xff0c;指电磁线圈由超导材料制成的核聚变装置。与传统托卡马克相比&#xff0c;超导托卡马克具有运行稳定性好、磁场强度高、能承受极强电流、能耗低等优势&#…

理智申请香港优才计划!香港优才的6个真相,很多人被坑了!

理智申请香港优才计划&#xff01;香港优才的6个真相&#xff0c;很多人被坑了&#xff01; 香港优才计划因为取消名额限制变得异常火爆&#xff0c;申请人数大幅上涨&#xff01; 其中也有不少人没有做过思考就直接申请的&#xff0c;最终结果就是被坑。 为什么说被坑&…

PAT A1016. 最短路径

题意 有N个结点围成一个圈&#xff0c;相邻两个点之间的距离已知&#xff0c;且每次只能移动到相邻点。然后给出M个询问&#xff0c;每个询问给出两个数字A和B即结点编号(1≤A,B≤N)&#xff0c;求从A号结点到B号结点的最短距离。样例解释 如图3-2所示,共有5个结点&#xff0c;…