React 中Redux结合React-Redux使用类组件版本(一)

一、Redux是什么?

1.Redux是一个专门用于状态管理的js库
2.它可以用在React、Angular、Vue的项目中,但基本与React配合使用。
3.作用:集中式管理React应用中多个组件共享的状态。

二、Redux 工作流程

在这里插入图片描述

三、Redux的三个核心概念

1.action

动作对象,包含2个属性
      type: 标识属性,值为字符串,唯一,必要属性
      data: 数据属性,值类型任意,可选类型
      例子:{ type: ‘increment’, data: 1}

2.reducer

1.用于初始化状态、加工状态
2.加工时,根据旧的state和action,产生新的state的纯函数
3.reducer是一个函数 countReducer(initState=0,action)

3.store

1.将state、action、reducer联系在一起的对象
2.如何得到此对象?
        1. import { createStore } from ‘redux’
         注意:createSotre 在新版本中提示已过期可以换成
         import { legacy_createStore as createStore } from “redux”;
        2.import count from ‘./reducer’
        3.const store = createStore(reducer)单个reducer
        4.createStore(combineReducers({ count: countReducer, person: personReducer }));
        5.
3.状态和方法
        1.getState() 得到state
        2.dispath(action) 分发action,触发reducer调用.
        3.subscribe 订阅(监听)注册监听,当产生新的state时,自动调用

四、案例实现

1.安装redux

1.npm install redux
//异步使用结合applyMiddleWare中间件
2.npm install redux-thunk  

2.在项目下构建store目录

1.构建index.js 主文件,代码如下:
import {
legacy_createStore as createStore,
combineReducers,
applyMiddleware
} from "redux"
import countReducer from "./reducers/countReducer"
//异步使用,注意:异步返回的action是一个函数
//非异步返回的是普通对象{action:xxxx,data:xxxx},且使用中间件applyMiddleWare
//多个reducer使用combieReducers结合起来使用{key:value}模式
//reducer 是一个函数
import {thunk} from "redux-thunk"
export default createStore(combineReducers( {count:countReducer}),applyMiddleware(thunk))
2.分别构建reducers目录、actions目录、及constant.js 常量化文件的模块化思想
1.actions 目录下构建 countAction.js 文件,代码如下:
import {increment,decrement} from "../constant"
export function incrementAction(data)
{return {type:increment,data}
}export function decrementAction(data)
{return {type:decrement,data}
}
//如果是异步返回的是函数
export function asyncAddValue(data,interval) {//默认会回传dispatch函数return (dispatch)=>{setTimeout(()=>{dispatch(incrementAction(data))},interval)}
}
2.在reducers目录下构建countReducer.js文件
import { act } from "react"
import {increment,decrement} from "../constant"
export default function countReducer(initState=0,action)
{const {type,data}=actionswitch(type){case increment:return data+initState;case decrement:return initState-data;default:return initState;}
}
3.在constant.js 常量文件中配置常量
export const increment="INCREMENT"
export const decrement="DECREMENT"
export const addPerson="ADDPERSON"3.项目下构建Components文件夹,里面构建count文件夹,count文件夹中构建index.js文件
import React,{Component} from 'react'
import store from "../../store/index"
import {incrementAction,decrementAction,asyncAddValue} from "../../store/actions/countAction"
export default class Count extends Component
{//构建状态state={selectValue:1}//通过受控组件模式获取下拉框的值selectGetValue=(e)=>{this.setState({selectValue:e.target.value})}//添加值addValue=()=>{//通过dispatch 分发分派动作 {action:xxxx,data:xxxx}store.dispatch(incrementAction(this.state.selectValue*1))}//减去值substractValue=()=>{store.dispatch(decrementAction(this.state.selectValue*1))}oddAddValue=()=>{//获取store中的状态必须用 getState() 获取状态const {count}=store.getState()if(count%2!==0)store.dispatch(incrementAction(this.state.selectValue*1))}asyncAddValue=()=>{store.dispatch(asyncAddValue(this.state.selectValue*1,500))}//生命周期函数:组件完全挂载完成componentDidMount(){//redux状态更改在ui中呈现,必须的订阅 subscribe 结合 setState 状态改变store.subscribe(()=>{this.setState({})})}render(){return <div><div>{store.getState().count}</div><div>{this.state.selectValue}</div><div><select onChange={this.selectGetValue}><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option></select><button onClick={this.addValue}>增加</button><button onClick={this.substractValue}>减少</button><button onClick={this.oddAddValue}>奇数增加</button><button onClick={this.asyncAddValue}>异步增加</button></div></div>}
}

React-Redux

Redux和React-Redux的区别

①:redux和组件进行对接的时候是直接在组件中进行创建。react-redux是运用Provider将组件和store对接,使在Provider里的所有组件都能共享store里的数据,还要使用connect将组件和react连接。
②:获取state的方式不一样
redux获取state是直接通过store.getState()。
react-redux获取state是通过mapStateToProps函数,只要state数据变化就能获取最新数据
③触发action的方式不一样。
redux是使用dispatch直接触发,来操作store的数据。
react-redux是使用mapDispathToProps函数然后在调用dispatch进行触发

React-Redux的工作原理

React-redux是一个redux的官方绑定react库,也是有三要素store,reducer,action 但是获取store中的数据与事件方法不一样,首先使用Provider标签将组件包裹起来,使store与组件对接,并且向store分发actions以更新数据,在组件中通过connect函数将组件与react对接,其中有两个参数一个是mapStatetoprops负责接收store中的数据,另一个是mapDispatchtoProps负责接收传递过来的的actions

React-Redux和Redux及UI之间的关系

在这里插入图片描述

Rect-Redux的常用功能

1.Provider 组件

import { Provider } from 'react-redux';
//在APP组件中使用
<Provider store={store}>xxxx组件
</Provider>

2.connect 函数

import {connect} from "react-redux"
1.mapStateToProps 和mapDispathToProps都是函数
2.mapStateToProps 函数内置参数state  mapDispathToProps 内置参数dispath
3.mapStateToProps和mapDispathToProps返回的都是对象
connect(mapStateToProps,mapDispathToProps)(UI组件)
React-Redux 使用步骤
react-redux 实例
1.安装 react-redux
npm install react-redux
2.index.js 使用Provider 组件注册 store
import React from 'react'
import ReactDOM from "react-dom/client";
import App from "./App"
import {Provider} from "react-redux"
import store from "./store/index"
const root=ReactDOM.createRoot(document.getElementById("root"))
root.render(<React.StrictMode><Provider store={store}><App></App></Provider></React.StrictMode>
)
3.构建容器组件用connect函数连接UI组件
import React,{Component, createRef} from "react"
import {connect} from "react-redux"
import {addPersonFun} from "../../store/actions/personAction"
import {nanoid} from "nanoid"
class Person extends Component
{userRef=createRef()//添加人员addPerson=()=>{const obj={userName:this.userRef.current.value,id:nanoid(),age:19}this.props.addPerson(obj)}render(){return <div><div><label htmlFor="userName">用户名:</label><input type="text" id="userName" ref={this.userRef}/><button onClick={this.addPerson}>添加人员</button></div><ul>{this.props.persons.map((item,index)=>{return <li key={item.id}>{item.userName}-{item.age}-     {item.id}</li>})}</ul>
</div>}
}
function mapStateToProps(state) {return {persons:state.person}
}
function mapDispathToProps(dispath) {return {addPerson:(data)=>{dispath(addPersonFun(data))}}
}
//connect 连接UI组件和mapStateToProps以及mapDispathToProps
export default connect(mapStateToProps,mapDispathToProps)(Person)4.store 的redux主文件index.js,combineReuders 合并personReducer.js
import {legacy_createStore as createStore,combineReducers,applyMiddleware} from "redux"
import countReducer from "./reducers/countReducer"
import personReducer from "./reducers/personReducer"
import {thunk} from "redux-thunk"
export default createStore(combineReducers(
{count:countReducer,person:personReducer
}
),applyMiddleware(thunk))
5.personReducer.js 内容代码如下:
import {addPerson} from "../constant"
export default function personReducer(initState=[],action) 
{const {type,data}=actionswitch(type){case addPerson:return [data,...initState]default:return initState}
}
6.personAction.js 代码如下:
import {addPerson} from "../constant"
export function addPersonFun(data) {return {type:addPerson,data}
}
7.constant.js 代码如下:
export const increment="INCREMENT"
export const decrement="DECREMENT"
export const addPerson="ADDPERSON"

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

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

相关文章

振弦采集仪在岩土工程监测中的精度与可靠性评估

振弦采集仪在岩土工程监测中的精度与可靠性评估 河北稳控科技振弦采集仪是一种常用的岩土工程土体力学参数监测仪器&#xff0c;它主要用于测量岩土中的应力、应变和模量等力学参数。在岩土工程中&#xff0c;土体力学参数的精确测量对于工程设计、施工和监测都非常重要。因此…

前缀和算法专题

应用: 计算数组中某区间的和 一. 一维前缀和[模版] 答案 二. 二维前缀和[模版] 答案 三. 寻找数组的中心下标 答案 四. 除自身以外数组的乘积 答案 五. 和为k的子数组 答案 六. 和可被k整除的子数组 答案 七. 连续数组 答案 八. 矩阵区域和 答案

如何查看网站的cookie?

前言&#xff1a; 在网络世界中&#xff0c;cookie是一种常见的信息存储方式。 对于开发者和普通用户来说&#xff0c;了解如何查看CSDN的cookie是非常重要的。 本文将介绍几种常用的方法&#xff0c;帮助大家更好地理解和使用cookie&#xff1a; 代码示例&#xff1a; 通过浏…

Docker基础篇之入门使用

文章目录 1. Docker的基本组成2. Docker平台架构3. 阿里云镜像加速4. Docker的Hello World入门案例5. 总结 1. Docker的基本组成 Docker的基本组成主要是有四部分&#xff0c;分别是镜像、容器和仓库。 镜像&#xff1a;Docker镜像就是一个只读的模版&#xff0c;镜像可以用来…

【Spring】深入理解 Spring 状态机:简化复杂业务逻辑的利器

前言 在软件开发中&#xff0c;有许多场景需要处理状态转换和状态驱动的逻辑&#xff0c;比如订单处理、工作流程管理、游戏引擎等。Spring 状态机&#xff08;Spring State Machine&#xff09;是 Spring Framework 提供的一个强大的模块&#xff0c;用于帮助开发人员轻松构建…

二叉搜索树BST ——(C++)

本篇将会讲解有关二叉树的搜索原理&#xff0c;以及关于二叉搜索树的建立&#xff0c;以及二叉树搜索树的插入、删除和查找等基本操作。最后我们还会对二叉搜索树进行功能扩展&#xff0c;介绍有关搜索二叉树的 K 模型和 KV 模型。目录如下&#xff1a; 目录 1. 搜索二叉树 二叉…

前端学习CSS-2

盒子模型 盒子模型相关属性 一些盒子模型的样式示例 传统网页布局方式 浮动 浮动的三大特性 脱标&#xff1a;脱离标准流一行显示&#xff0c;顶部对齐具备行内块元素特性 定位

Java整合EasyExcel实战——1

参考&#xff1a;读Excel | Easy Excel快速使用easyexcel的来完成excel的读取https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read 准备条件 依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifa…

Android 动效整理

Android自定义SeekBar&#xff0c;滑动时弹出气泡指示器显示进度 安卓开发中非常炫的效果集合_android 开发 向右上角收起炫酷动态效果-CSDN博客 https://github.com/shenghuntianlang/Android-Views?tabreadme-ov-file#decentbanner 以前收藏了很多文章&#xff0c;但是过…

【UE5.1 角色练习】08-传送技能

前言 在上一篇&#xff08;【UE5.1 角色练习】07-AOE技能&#xff09;基础上继续实现人物通过鼠标点击然后传送技能的功能。 效果 步骤 1. 首先需要显示鼠标光标&#xff0c;我们可以在玩家控制器中勾选“显示鼠标光标” 2. 在项目设置中添加一个操作映射&#xff0c;设置按…

Python爬虫入门实例:Python7个爬虫小案例(附源码)

引言 随着互联网的快速发展&#xff0c;数据成为了新时代的石油。Python作为一种高效、易学的编程语言&#xff0c;在数据采集领域有着广泛的应用。本文将详细讲解Python爬虫的原理、常用库以及实战案例&#xff0c;帮助读者掌握爬虫技能。 一、爬虫原理 爬虫&#xff0c;又…

2024年上半年信息系统项目管理师下午真题及答案(第二批)

试题一 某项目计划工期为10个月&#xff0c;预算210万元&#xff0c;第7个月结束时&#xff0c;项目经理进行了绩效评估&#xff0c;发现实际完成了总计划进度的70%。项目的实际数据如表所示&#xff1a; 单击下面头像图片领取更多软考独家资料

企业内部通讯软件—WorkPlus适配信创即时通讯软件

在现代企业中&#xff0c;良好的内部通讯是保持高效工作和顺利运营的关键。企业内部通讯软件的选择对于提升沟通效率、促进团队合作、保障数据安全和隐私保护至关重要。本文将介绍企业内部通讯软件的重要性探讨一些常用的软件&#xff0c;帮助企业做出明智的选择。 一、企业内…

深度融合大语言模型与知识图谱:思通数科企业知识库智能问答系统的创新实践

摘要 在知识经济时代&#xff0c;企业知识管理的重要性日益凸显。本文深入探讨了思通数科如何利用大语言模型和知识图谱技术&#xff0c;构建企业知识库智能问答系统&#xff0c;以促进知识的高效获取、共享、应用和创新&#xff0c;从而提升企业的知识管理水平和业务价值。 1…

钕铁硼表面磷化处理

大家都知道烧结钕铁硼易氧化、易腐蚀&#xff0c;日久将造成磁性能的衰减甚至丧失&#xff0c;所以使用前必须进行严格的防腐处理。在之前的文章中已经向大家介绍过与烧结钕铁硼表面处理相关的知识和电镀的工艺流程&#xff0c;除了电镀之外&#xff0c;钕铁硼表面处理还可采用…

Reids高频面试题汇总总结

一、Redis基础 Redis是什么? Redis是一个开源的内存数据存储系统,它可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,并提供了丰富的操作命令来操作这些数据结构。Redis的主要特点是什么? 高性能:Redis将数据存储在内…

大数据开发面试题【ClickHouse篇】

170、clickhouse介绍以及架构 clickhouse一个分布式列式存储数据库&#xff0c;主要用于在线分析查询 171、列式存储和行式存储有什么区别&#xff1f; 行式存储&#xff1a; 1、数据是按行存储的 2、没有建立索引的查询消耗很大的IO 3、建立索引和视图花费一定的物理空间和…

rapidssl通配符证书低至600元一年

RapidSSL是Geotrust旗下的子品牌&#xff0c;主要经营的是入门级的SSL数字证书。RapidSSL旗下的SSL证书产品不多&#xff0c;只有DV基础型单域名SSL证书和通配符SSL证书&#xff0c;不过这两款SSL证书满足了大多数网站的需求。今天就随SSL盾小编了解RapidSSL旗下的通配符SSL证书…