[电子榨菜]状态管理redux,以及react-redux

news2024/12/25 12:34:37

0.写在前面

很遗憾,最终还是没能入围2023年的博客评选。

不过不管怎么说,今年需要开个好头。

迫于成本压力吧,最终还是没能顺利离开这里。。。。。。

其实白天已经能放的下啦,我给自己买了喜欢的玩具,去了喜欢的漫展,做自己喜欢的orm开发。

只是在晚上的时候,心如乱码,睡不着,流泪。

1.什么是redux

redux是一种常用的状态管理组件,虽然redux被归类为react的全家桶中,但是实际上这个东西不仅仅支持react,而是全面适配js的。

但是我们仍然可以以react的情况作为一个案例分析,在react中,每个模块/组件,都维护了自己的state状态,里面是一些数值或者一些需要保存的东西。但是这带来一个问题就是,我们跨组件调用和维护显得异常麻烦。

而redux等状态管理工具,负责维护的是一个全局的状态组件,通过store对象来进行对于全局state的监听,修改,和获取操作。其实对标的是vue全家桶中的vuex。

2.redux的基本定义和概念

在了解redux之前,我们可以介绍一下如下四个概念:

action:顾名思义,动作,这个动作是一个对象,数值为state将要修改的数值。

在store内部的reducer函数中,我们可以根据传入的action修改state

需要注意的一点是,我们通常约定,action对象内部必须有一个字段type,既是方便了我们在reducer中识别的规范,也约定了这是一个action对象。

state:状态(注意action和state不能画等号,也并非一定要把action给转化为state,action仅仅只是指明了reducer如何修改state)

store:存储对象,也可以称之为状态管理对象,用来保存state,并且提供一些state的操作。

reducer:一个用来处理action的函数,根据reducer可以生成一个store对象,根据redux的要求,reducer需要接受两个参数,state和action,返回根据逻辑修改以后的state. 简单来说reducer就规定了store在接受到action以后,该进行怎么样的逻辑

大致的工作过程就是:

根据reducer生成store,再调用store对应的方法(比如使用dispatch提交action)

3.redux的构建和使用:

首先要先下载

npm install redux

 下载完成以后,我们首先构建一个reducer对象

const rootReducer=(state={type:'',num:0},action)=>{
    //内部执行逻辑
    return action;
}
export default rootReducer;

然后根据reducer对象,构建一个store 对象

import {createStore} from 'redux'  //被废弃了??
import rootReducer from './Reducer'
const store=createStore(rootReducer);//根据reducer策略实现store
export default store;

 而对于action,我们通常做的方法是创建一个action构建方法,这是在实际工程中常用的方法

const sendAction=()=>{
    return {
        type:'这个东西干啥的',
        num:1
    }
}
export default sendAction;

接下来,在实际项目中,我们可以通过调用store的三个api来完成监听状态变化,提交变化,获取数值三个功能

根据创建的逻辑差不多是这样子的,首先要创建出一个reducer函数,这个函数接收两个参数,原本的state,以及全新传入的action

store对象内部根据全新的action,以及依赖构建的reducer函数,进行自己的逻辑判断,决定状态如何书写,最终返回一个新的state

Store对象有三个函数,分别为getState(), subscribe(), dispatch(),实现这些功能;

另外这里需要补充一个api:combineReducer

这个函数主要的目的在于,我们可能有多个处理逻辑,也就是有多个reducer。

还是很抽象,我说个例子

比如我们的状态中有两条:用户,计数器

假设这是一个很复杂的东西,我们需要拆分成多个reducer来处理

我们可以创建出两个reducer,分别用来修改这个两个东西,然后通过该api将两个reducer组合到一起。这样两个reducer生成的state将会组合成最终的state

代码如下

import { combineReducers } from 'redux';

// 子 reducer 1
function counterReducer(state = 0, action) {
  switch(action.type) {
    case 'INCREMENT':
      return state + 1;
    case 'DECREMENT':
      return state - 1;
    default:
      return state;
  }
}

// 子 reducer 2
function userReducer(state = null, action) {
  switch(action.type) {
    case 'SET_USER':
      return action.payload;
    case 'CLEAR_USER':
      return null;
    default:
      return state;
  }
}

// 合并 reducer
const rootReducer = combineReducers({
  counter: counterReducer,
  user: userReducer
});

// 创建 Redux store
const store = createStore(rootReducer);

4.react-redux:

redux可以直接使用在react中,但是redux也推出了react的官方适配版本,作出的改进主要有两个

1. 提供了更简单的store调用方法,不需要在每个模块里进行导包

2. 对组建进行增强,将发送action的方法和state中的属性全都绑定在props中

以上两个要点都是基于context机制实现的

操作方法如下:

首先store仍然是需要我们自己使用reducer构建出来的,和上面没有区别

(1)Provider,包裹根组件,保证store能传递到下方的任意组件

首先要创建一个provider,包裹跟组建,然后将我们的store对象传递下去

(2)创建mapDispatchToProps,mapStateToProps方法并且增强组件

import { useEffect } from "react"
import { connect } from "react-redux"
import store from "../../reactredux/store"

//使用了两个函数来实现了监听和修改的非手动操作
//两个函数分别返回封装成对象的Action构建方法,和新的state
//使用connect实现了,将新增Action的方法加入props,并且让这个方法在创建Action以后直接发送出去
//并且将state中的属性也给保存进props里面了

const mapStateToProps=(state)=>{        //返回值为新的state
    console.log("修正以后的数据为",state)  //将state中的属性放置在props中
    return state
}

const mapDispatchToProps=(dispatch)=>{  //返回值为封装成对象的Action发送方法,这是一种推荐的做法
    return{
        sentAction:()=>{                //将这个对象内部的方法给绑定到props中
            dispatch({ type:'', num:1})
        }
    }
}

//具体的使用

function Page2(props) {
    const handleClick=()=>{
        props.sentAction()  //发送dispatch进行修改
    }
  return (
    <div>
      {props.type}         //读取数据
      <button onClick={handleClick}> ceshi1 </button>
    </div>
  );
}

//增强组件
export default connect(mapStateToProps,mapDispatchToProps)(Page2);

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

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

相关文章

Typescript 中的namespace

命名空间&#xff1a; 类似 vuex 的 namespace 相当于一个容器。 namespace 是一种将相关代码组织在一起的方式&#xff0c;中文译为“命名空间”。 它出现在 ES 模块诞生之前&#xff0c;作为 TypeScript 自己的模块格式而发明的。但是&#xff0c;自从有了 ES 模块&#x…

龙蜥操作系统上玩转铜锁密码库

编者按&#xff1a;龙蜥操作系统 Anolis OS 支持多计算架构&#xff0c;也面向云端场景优化&#xff0c;兼容 CentOS 软件生态&#xff0c;旨在为广大开发者和运维人员提供稳定、高性能、安全、可靠、开源的操作系统服务。本文为龙蜥社区理事单位蚂蚁集团技术专家张成龙&#x…

初识Winform

什么是winform&#xff1f; WinForms&#xff08;Windows Forms&#xff09;是Microsoft .NET框架中的一个用户界面&#xff08;UI&#xff09;技术&#xff0c;用于创建Windows应用程序。它提供了一组用于构建图形用户界面的类和控件&#xff0c;以及与用户交互的事件模型。 …

HackTheBox - Medium - Linux - Awkward

Awkward Awkward 是一款中等难度的机器&#xff0c;它突出显示了不会导致 RCE 的代码注入漏洞&#xff0c;而是 SSRF、LFI 和任意文件写入/追加漏洞。此外&#xff0c;该框还涉及通过不良的密码做法&#xff08;例如密码重用&#xff09;以及以纯文本形式存储密码来绕过身份验…

CEC2017(Python):七种算法(RFO、DBO、HHO、SSA、DE、GWO、OOA)求解CEC2017

一、7种算法简介 1、红狐优化算法RFO 2、蜣螂优化算法DBO 3、哈里斯鹰优化算法HHO 4、麻雀搜索算法SSA 5、差分进化算法DE 6、灰狼优化算法GWO 7、鱼鹰优化算法OOA 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., &…

聚观早报 |小米汽车SU7官图发布;优酷上线“AI搜片”功能

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 12月29日消息 小米汽车SU7官图发布 优酷上线“AI搜片”功能 小米汽车智能驾驶技术公布 百度投资AIGC公司必优科技…

安科瑞新能源汽车车充电桩有序充电——安科瑞 顾烊宇

要&#xff1a;随着当前经济的不断发展&#xff0c;国家的科技也有了飞速的进步&#xff0c;传统的燃油汽车已经不能适应当前社会的发展&#xff0c;不仅对能源造成巨大的消耗&#xff0c;还对环境造成了污染&#xff0c;当前一种新型的交通运输工具正在占领汽车市场。新能源汽…

OEE如何为制造企业实施ISO50001提供支持

ISO50001是一项旨在帮助企业建立和实施能源管理体系的国际标准&#xff0c;以提高能源效率、降低能源消耗和减少环境影响。而设备OEE&#xff08;设备综合效率&#xff09;作为一个关键的生产效率指标&#xff0c;可以为企业实施ISO50001提供重要的支持。本文将介绍ISO50001能源…

手机/平板实现电脑第三屏-记录极简

软件&#xff1a; 手机 平板 : moonlight 电脑&#xff1a; 1 KtzeAbyss/Easy-Virtual-Display 2 Parsec Virtual Display Driver https://builds.parsec.app/vdd/parsec-vdd-0.38.0.0.exe 3 LizardByte/Sunshine: Self-hosted game stream host for Moonlight. (gith…

java练习题之List(ArrayList)集合练习

List集合 习题&#xff1a; 1&#xff1a;完成以下填空&#xff1a; List 接口的特点是元素 有序 &#xff08;有|无&#xff09;顺序&#xff0c; 可重复 &#xff08;可以|不可以&#xff09;重复&#xff1b; 2&#xff1a;(List)关于List 集合描述正确的是&#xff08;…

2022年第十三届中国数据库技术大会(DTCC2022)-核心PPT资料下载

一、峰会简介 本届大会以“数据智能 价值创新”为主题&#xff0c;设置2大主会场&#xff0c;20技术专场&#xff0c;邀请超百位行业专家&#xff0c;重点围绕时序数据库、图数据技术、实时数仓技术与应用实践、云原生数据库、大数据平台与数据安全等内容展开分享和探讨&#…

git的拉取、提交、合并、解决冲突详细教程

我们在开发中使用git&#xff0c;经常会遇到拉代码&#xff0c;切换分支&#xff0c;提交代码&#xff0c;新建分支&#xff0c;合并代码&#xff0c;解决冲突这些操作&#xff0c;下面我跟大家分享一个好用的git工具来进行这些操作。 首先&#xff0c;我们下载一个git工具 点…

Python在金融大数据分析中的AI应用实战

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 随着人工智能时代的到来&#xff0c;Python作为…

数据结构学习 jz16 数值的整数次方

关键词&#xff1a;快速幂 位运算 之前已经学过快速幂了&#xff0c;所以只是回忆。快速幂有递归版和非递归版。 题目&#xff1a; 这道题和之前的快速幂的区别是 n可能为负数。分类讨论即可。 思路&#xff1a; 区分正负&#xff1a; if (n < 0) return POW(1.0 / x, …

git 回退版本

git 回退版本 1.查看记录 git log 2.如何回退 git reset --hard commit_id commit_id为上面加深的id 3.强制提交 git push origin HEAD --force

关于BraTS数据集中的Ground Truth标签的划分描述

引用自&#xff1a; Wang, Wenxuan, et al. "Transbts: Multimodal brain tumor segmentation using transformer." Medical Image Computing and Computer Assisted Intervention–MICCAI 2021: 24th International Conference, Strasbourg, France, September 27–…

第12课 利用openCV检测物体是否运动了

FFmpeg与openCV绝对是绝配。前面我们已经基本熟悉了FFmpeg的工作流程&#xff0c;这一章我们重点来看看openCV。 在前面&#xff0c;我们已经使用openCV打开过摄像头并在MFC中显示图像&#xff0c;但openCV能做的要远超你的想像&#xff0c;比如可以用它来实现人脸检测、车牌识…

web3d-three.js场景设计器-TransformControls模型控制器

场景设计器-TransformControls 控制器 该控制器可以指定模型进入可控制模式-如图有三种控制方式 translate --移动模式 rotate -- 旋转模式 scale -- 缩放模式 方便布局过程中快捷对模型进行摆放操作。 引入方式 import { TransformControls } from three/examples/jsm/…

设计模式(4)--类行为(10)--模板方法

1. 意图 定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。 模板方法使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2. 两种角色 抽象类(Abstract Class)、具体类(Concrete Class) 3. 优点 3.1 一种代码复用的基本技术。提取公共行为&am…

C语言编译器(C语言编程软件)完全攻略(第十部分:VS2022下载和安装教程(图解版))

介绍常用C语言编译器的安装、配置和使用。 十、VS2022下载和安装教程&#xff08;图解版&#xff09; Visual Studio&#xff08;简称 VS&#xff09;是微软开发的一款 IDE&#xff0c;支持多种编程语言&#xff08;C/C、Python、C#、JavaScript 等&#xff09;&#xff0c;实…