React之redux的模板

news2025/1/10 16:43:12

文章目录

    • 以下为模板代码
      • 安装(添加 Redux Toolkit 和 React-Redux 依赖包到你的项目中)
      • 以下为项目目录
      • 在store/index.js里面的模板
      • 创建模块(模块化思想),这里就是模板,所有模块通用(src/features/userSlice.js)
      • 在main.jsx引入模板(只需要看下面画横线的四行)
      • 在组件内使用
    • 以下是针对上面模板的示例代码
      • 在store/index.js里面的
      • 创建模块一(模块化思想),src/features/userSlice.js
      • 创建模块二(模块化思想),src/features/counterSlice.js
      • 在main.jsx引入模板
      • 在组件内使用

以下为模板代码

安装(添加 Redux Toolkit 和 React-Redux 依赖包到你的项目中)

npm install @reduxjs/toolkit react-redux

以下为项目目录

在这里插入图片描述

在store/index.js里面的模板

import { configureStore } from '@reduxjs/toolkit';
import { setUserinfo } from '@/store/features/userSlice';
// 创建仓库实例
const store = configureStore({
	// 合并多个slice中的reducer
	reducer: {
		user:setUserinfo 
	},
});
export default store;

创建模块(模块化思想),这里就是模板,所有模块通用(src/features/userSlice.js)

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

export const userSlice = createSlice({
	name: 'user',
	initialState: {
		userinfo: {
		},
	},

	reducers: {
		setUserinfo(state, { payload }) {
		},
	},
});

export const { setUserinfo } = userSlice.actions;

export default userSlice.reducer;

在main.jsx引入模板(只需要看下面画横线的四行)

import { StrictMode } from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

import store from '@/store';
---------------------------
import { Provider } from 'react-redux';
--------------------------------------
// 用 react-redux 提供的 Provider 组件,并且在渲染之前将根组件App包装进 <Provider>。
// 使用Provider组件将store作为prop注入整个react程序,注入之后程序中所有的组件中都可以使用store
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
	<StrictMode>
		<Provider store={store}>
		-----------------------
			<App />
		</Provider>
		-----------
	</StrictMode>
);

在组件内使用

import { useDispatch, useSelector } from 'react-redux';
// 导入action函数
import { setUserinfo } from '@/store/features/userSlice';

export default function App() {
	// 1、组件中访问redux的state
	// 通过useSelector直接拿到store中定义的user属性
	const { userinfo } = useSelector(store => store.user);

	// 2、组件中分发redux的action
	// 使用 useDispatch 钩子获取 dispatch 函数,并根据需要 dispatch actions
	const dispatch = useDispatch();

	return (
		<div className='App'>
		    <!--这里点击按钮就可以修改store的值了-->
			<button onClick={() => dispatch(setUserinfo({ name: '李四', age: 22 }))}>按钮3</button>
		</div>
	);
}

以下是针对上面模板的示例代码

在这里插入图片描述

在store/index.js里面的

import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './features/counterSlice';
import userReducer from './features/userSlice';

// 创建仓库实例
const store = configureStore({
	// 合并多个slice中的reducer
	reducer: {
		counter: counterReducer,
		user: userReducer,
	},
});

export default store;

创建模块一(模块化思想),src/features/userSlice.js

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

export const userSlice = createSlice({
	name: 'user',
	initialState: {
		userinfo: {
			name: '张三',
			age: 18,
		},
	},

	reducers: {
		setUserinfo(state, { payload }) {
			console.log('setUserinfo: ', payload);
			state.userinfo = payload;
		},
	},
});

export const { setUserinfo } = userSlice.actions;

export default userSlice.reducer;

创建模块二(模块化思想),src/features/counterSlice.js

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

// 创建slice
export const counterSlice = createSlice({
	// 添加唯一的标识
	name: 'counter',
	// 状态
	initialState: {
		count: 1,
	},

	// 1、定义reducer更新状态的函数
	// 2、是组件中dispatch使用的actions函数
	reducers: {
		// action函数,参数 state 就是状态
		increment(state) {
			console.log('increment state: ', state.count);
			state.count++;
    },

    // dispatch(incrementByData(2))
    // 参数 action 分发action时传递的数据,action中有两个属性  payload, type
    // payload 就是载荷,就是分发incrementByData 传递的数字2
    // type 是action的类型: counter/incrementByData

    // incrementByData (state, action) {
    //   console.log('incrementByData: ', action);
    // }
    incrementByData (state, {payload, type}) {
      console.log('payload: ', payload);
      state.count += payload
    }

	},
});

// console.log('counterSlice: ', counterSlice);

// 导出 action 函数
export const {
  increment,
  incrementByData
} = counterSlice.actions;

// 导出reducer
export default counterSlice.reducer;

在main.jsx引入模板

import { StrictMode } from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

import store from '@/store';
import { Provider } from 'react-redux';

import '@/setting';

// 用 react-redux 提供的 Provider 组件,并且在渲染之前将根组件App包装进 <Provider>。
// 使用Provider组件将store作为prop注入整个react程序,注入之后程序中所有的组件中都可以使用store
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
	<StrictMode>
		<Provider store={store}>
			<App />
		</Provider>
	</StrictMode>
);

在组件内使用

import { useDispatch, useSelector } from 'react-redux';
// 导入action函数
import { increment, incrementByData } from '@/store/features/counterSlice';
import { setUserinfo } from '@/store/features/userSlice';

export default function App() {
	// 1、组件中访问redux的state
	// 通过useSelector直接拿到counter store中定义的count属性
	const { count } = useSelector(store => store.counter);
	const { userinfo } = useSelector(store => store.user);

	// 2、组件中分发redux的action
	// 使用 useDispatch 钩子获取 dispatch 函数,并根据需要 dispatch actions
	const dispatch = useDispatch();

	return (
		<div className='App'>
			<h1 className='h1'>hello react </h1>
			<p> count = {count} </p>
			<p> userinfo.name = {userinfo.name} </p>
			<p> userinfo.age = {userinfo.age} </p>
			<button onClick={() => dispatch(increment())}>按钮1</button>
			<button onClick={() => dispatch(incrementByData(2))}>按钮2</button>
			<button onClick={() => dispatch(setUserinfo({ name: '李四', age: 22 }))}>按钮3</button>
		</div>
	);
}

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

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

相关文章

【网课平台】Day16.项目优化:压测、加缓存优化与分布式锁

文章目录 一、压力测试1、优化需求2、性能指标3、安装Jmeter4、压力测试5、优化日志 二、缓存优化1、给接口加Redis缓存2、缓存穿透3、解决缓存穿透4、缓存雪崩5、缓存击穿 三、分布式锁1、本地锁的问题2、IDEA一个项目启动多个实例3、分布式锁4、Redis NX实现分布式锁5、Redis…

多项式加法(用 C 语言实现)

目录 一、多项式的初始化 二、多项式的创建 三、多项式的加法 四、多项式的输出 五、清除链表 六、主函数 用链表实现多项式时&#xff0c;每个链表节点存储多项式中的一个非零项&#xff0c;包括系数&#xff08;coef&#xff09;和指数&#xff08;exp&#xff09;两个…

Java8新特性函数式编程 - Lambda、Stream流、Optional

1.Lambda表达式 1.1 概述 ​ Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。 1.2 核心原则 可推导可省略 1.3 基本格式 (参数列表)->{代码}例一…

python毕业设计之django+vue公司企业物流信息管理系统

基于 开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 语言设计并实现了速运公司物流信息管理系统。该系统基于B/S即所谓浏览器/服务器模式&…

智慧物流信息系统开发需具备哪些功能?

智慧物流软件开发公司在制作管理系统的时候&#xff0c;需要具备的功能有哪些呢&#xff1f; 一、采集跟踪功能。 &#xff08;1&#xff09;、信息采集&#xff1a;信息采集跟踪系统是智能物流系统的重要组成部分。物流信息采集系统主要由RFID射频识别系统和Savan…

【Hadoop-HDFS】HDFS中Fsimage与Edits详解

【Hadoop-HDFS】HDFS中Fsimage与Edits详解 1&#xff09;概述2&#xff09;NameNode元数据解析3&#xff09;Fsimage3.1.Fsimage 的作用3.2.FSimage 的文件信息查看 4&#xff09;Edits4.1.Edits 的作用4.2.Edits 的文件信息查看 5&#xff09;元数据信息目录的配置 1&#xff…

【2023.04.28】Windows配置MongoDB服务

【2023.04.28】Windows配置MongoDB服务 1、背景2、操作2.1 配置环境变量2.2 配置本地Windows MongoDB服务 环境&#xff1a;Windows11&#xff0c;Mongo 6.0.5【该版本没有mongo.exe】 1、背景 某一天想使用电脑以前安装的 MongoDB&#xff0c;发现用 Navicat 连接不了&#…

4个很多人都不知道的现代JavaScript技巧

JavaScript在不断的进化和升级&#xff0c;越来越多的新特性让我们的代码变得更加简洁。因此&#xff0c;今天这篇文章&#xff0c;我将跟大家分享 4 个不常用的 JavaScript 运算符。让我们一起研究它们。 1.可选的链接运算符 这个功能非常好用&#xff0c;它可以防止我的代码…

pwm调节亮度

文章目录 运行环境&#xff1a;1.1 pwm1)占空比2)A板原理图3)PE11引脚配置4)定时器Timers配置 2.1代码解释1)定时器1初始化函数2)启动定时器中断3)启动PWM/设置占空比4)launch设置5) 编译调试 3.1实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32…

Leetcode202. 快乐数

Every day a leetcode 题目来源&#xff1a;202. 快乐数 解法1&#xff1a;hash 根据几个例子&#xff0c;我们发现只有2种结果&#xff1a; 最终会得到1最终进入一个循环 其实得到1后&#xff0c;继续计算&#xff08;将该数替换为它每个位置上的数字的平方和&#xff09…

美妆“数字员工”来了!丸美:每月节省30人日!提升员工幸福感,企业效益稳增

美妆&#xff0c;因其效果可视觉化呈现的特征&#xff0c;决定了美妆品牌与直播带货的高匹配度。流量&#xff0c;是直播商家深入了解粉丝参与情况和商品销售状况的重要依据。因此&#xff0c;美妆商家需要每天下载直播数据报表&#xff0c;监测流量、成交变化趋势&#xff0c;…

数据可视化 —— 小练习1 KMeans聚类并数据可视化图像像素点

数据可视化Task1 任务描述&#xff1a;对图片RGB点进行Kmeans聚类&#xff0c;并将结果数据可视化于前端浏览器上 实验平台&#xff1a; Visual Studio CodeHTML/CSS/JavascriptEdge/Chorme/Firefox 浏览器Echart.min.js 3.8.5版 &#xff08;过高的版本浏览器无法include&a…

Python采集豆Top250电影数据 , 看看质量及评分

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 本次案例涉及点: 1、动态数据抓包演示 2、csv文件保存 3、requests模块的使用 4、parsel解析数据的使用 环境介绍&#xff1a; 软件安装 python 3.8 pycharm 不会安装的可以文末名片我获取哦 &#x1f60e; 模块使用…

windows安装flutter

在flutter官网下载flutter 在 Windows 操作系统上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 下载文件后&#xff0c;解压文件把文件存放在指定位置 打开flutter_console.bat文件 输入flutter doctor flutter报错提示&#xff08;…

unity-VRTK学习日记1(VRTK4|无头盔开发模拟器SpatialSimulator)

目录 前言 前期准备 1.配置VRTK4&#xff1a; 2.把几个插件给安装好 查看自己安装了哪些VRTK插件 3.添加模拟器 操作方法 操作方法&#xff1a;人话 前言 VRTK的较早版本不适用于Unity的新版本&#xff0c;原因好像是Unity将VR开发功能并入到自家的XR下了。就是之前更新…

即时通讯独立系统源码包含Android 、iOS、PC

demo软件园每日更新资源,请看到最后就能获取你想要的: 1.经典版哇呼星聊即时通讯独立系统源码 包含Android 、iOS、PC 自带教程 哇呼星聊即时通讯系统源码 AndroidiOSPC三端 附教程 服务器最低配置4H4G 这套安装跟shiku一样 1.安装宝塔&#xff0c;只安装Nginx&#xff0c;其他…

力扣,合并石头最低成本算法题

1&#xff1a;这个题有题解&#xff0c;自己可以去看力扣&#xff0c;合并石头 2&#xff1a;网上也有视频自己去看视频讲解 3&#xff1a;下面我自己的一些理解 4&#xff1a;原需求&#xff1a; 5&#xff1a;代码&#xff1a;使用贪心算法和最小堆来求解&#xff1a; im…

FreeRTOS系统学习-内核篇.01-数据结构---列表与列表项定义详解-链表节点插入实验

# 内核篇.01 列表与列表项 为什么要学列表&#xff1f;链表单向链表双向链表 FreeRTOS 中链表的实现节点节点初始化尾节点根节点链表根节点初始化将节点插入到链表的尾部将节点按照升序排列插入到链表将节点从链表删除节点带参宏小函数 链表节点插入实验实验现象 为什么要学列表…

TPM-TPM-Profile-PTP协议-2

TCG_PCClient_Device_Driver_Design_Principles_TPM2p0_v1p1_r4_211104_final.pdf 4 简介 本文档补充了 TCG PC Client Platform TPM Profile for TPM 2.0 Specification [PTP]&#xff1b; 特别是&#xff0c;本文档为有兴趣开发 DD 的 DD 编写者提供指导&#xff0c;以便与旨…

【C++】带你先入门类和对象(上)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言一、面向过程和面向对象初步认识二、类的引入三、类的定义四.类的访问限…