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

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);

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

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

相关文章

MySQL:约束主键唯一键

表的约束&#xff1a;表中一定有约束&#xff0c;通过约束让插入表中的数据是符号预期的 约束的本质是通过技术手段&#xff0c;倒逼程序员插入正确的数据 Null约束 这里的Null表示在插入的时候&#xff0c;该属性能否为空&#xff0c;如果是NO&#xff0c;则插入时候必须有数…

《Effective C++》《Resource Management》

文章目录 13、term13:Use objects to manage resources14、term14:Think carefully about copying behavior in resource-managing classes15、term15:Provide access to raw resources in resource-managing classes法一&#xff1a; 使用智能指针的get进行显示转换法二&#…

第11课 实现桌面与摄像头叠加

在上一节&#xff0c;我们实现了桌面捕获功能&#xff0c;并成功把桌面图像和麦克风声音发送给对方。在实际应用中&#xff0c;有时候会需要把桌面与摄像头图像叠加在一起发送&#xff0c;这节课我们就来看下如何实现这一功能。 1.备份与修改 备份demo10并修改demo10为demo11…

Python数据分析从入门到进阶:分类算法

数据分析是处理和解释数据以发现有用信息和洞察的过程。其中&#xff0c;分类算法是数据分析领域的一个重要组成部分&#xff0c;它用于将数据分为不同的类别或组。 本文将介绍分类算法的基本概念和进阶技巧&#xff0c;以及如何在Python中应用这些算法&#xff0c;包括示例代…

01.微服务架构优缺点、服务拆分和远程调用

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff1a;将业务的所有…

企业招聘信息查询API:招聘市场情报站,一键了解就业机会

前言 在当今这个信息爆炸的时代&#xff0c;快速、准确地获取企业招聘信息对于求职者来说至关重要。为了满足这一需求&#xff0c;企业招聘信息查询API应运而生&#xff0c;它为求职者提供了一个便捷、高效的平台&#xff0c;帮助用户快速了解企业的招聘动态。本文将详细介绍企…

众和策略:全国期货市场成交量同比增长25%

近来&#xff0c;我国期货业协会发布2023年12月全国期货商场生意状况数据。以单边核算&#xff0c;12月全国期货生意商场成交量为6.91亿手&#xff0c;成交额为480437.25亿元&#xff0c;同比分别添加4.48%和0.08%&#xff0c;环比分别下降12.58%和12.49%。2023年1-12月&#x…

AI写作生成器哪个好用一点,试试下面这五款

AI写作生成器在当今信息时代的快速发展中&#xff0c;成为了许多人的选择。然而&#xff0c;面对市场上众多的AI写作生成器&#xff0c;我们很难判断哪个更好用一点。为了解决这个问题&#xff0c;本文将介绍并使用下面这五款AI写作生成器&#xff0c;以帮助大家做出更明智的选…

使用 SpringSecurity 发送POST请求出现 403

问题场景 在使用 SpringSecurity 时对一些访问权限进行了设置, 在用户请求资源时出现了403错误 , 通过检查代码发现请求权限是开放的, 并且切换成 GET 请求也是可以通过, 换成POST 请求就无法通过。 解决方法 在 SpringSecurity 中关闭 CSRF 因为 前端向后台发送 post 请求…

【kettle】pdi/data-integration 打开ktr文件报错“Unable to load step info from XML“

一、报错内容&#xff1a; Unable to load step info from XML step nodeorg.pentaho.di.core.exception.KettleXMLException: Unable to load step info from XMLat org.pentaho.commons.launcher.Launcher.main (Launcher.java:92)at java.lang.reflect.Method.invoke (Met…

2023年终总结(脚踏实地,仰望星空)

回忆录 2023年&#xff0c;经历非常多的大事情&#xff0c;找工作、实习、研究生毕业、堂哥结婚、大姐买车、申博、读博、参加马拉松&#xff0c;有幸这一年全家人平平安安&#xff0c;在稳步前进。算是折腾的一年&#xff0c;杭州、赣州、武汉、澳门、珠海、遵义来回跑。完成…

rotate-captcha-crack项目重新训练百度旋转验证码角度预测模型

参考&#xff1a; building-powerful-image-classification-models-using-very-little-data.html https://github.com/Starry-OvO/rotate-captcha-crack &#xff08;主&#xff09;作者思路&#xff1a;https://www.52pojie.cn/thread-1754224-1-1.html 纠正 新版百度、百家…

晨控 CK-FR08-A01 与汇川 H5U 系列 PLC 通讯手册

晨控 CK-FR08-A01 与汇川 H5U 系列 PLC 通讯手册 准备阶段 软件 &#xff1a; AutoShop PLC &#xff1a; H5U-1614MTD-A8 读写器&#xff1a; CK-FR08-A01 交换机&#xff1a; 标准POE交换机 电源 &#xff1a; 24V直流电源 简介 CK-FR08-A01 是一款基于射频识别技…

C语言实用第三方库Melon开箱即用之多线程模型

在之前的文章中&#xff08;开发利器——C 语言必备实用第三方库&#xff09;&#xff0c;笔者介绍了一款Linux/UNIX下C语言库Melon的基本功能&#xff0c;并给出了一个简单的多进程开箱即用的例子。 本文将给大家介绍Melon中多线程的使用方法。 在Melon中有三种多线程模式&a…

Kodi 开源多媒体播放器

Kodi (原名 XBMC) 是一款经典开源免费、跨平台且极其强大专业的多媒体影音播放器&#xff0c;包含专业的影音内容管理以及解码播放功能于一体&#xff0c;提供适合在手机/电视/投影/大屏幕上显示的全屏界面&#xff0c;无线手机遥控操作方式&#xff0c;以及功能相当丰富的插件…

第三部分使用脚手架:vue学习(66-69)

文章目录 66.props配置67 mixin混入68 插件69 scoped样式 66.props配置 props配置&#xff0c;说白了就是调用子组件&#xff0c;传参数用的。 父组件的写法&#xff1a;传参。传参必须加引号&#xff0c;否则报错。 子组件的写法&#xff1a;接收。接受有3种方式&#xff0c…

【观察】Aginode安捷诺:坚守“长期主义”,服务中国数字经济

毫无疑问&#xff0c;随着整个社会加速数字化转型&#xff0c;尤其是5G、人工智能、大数据等技术兴起&#xff0c;以及智慧医疗、智慧金融、智能制造等应用加速落地&#xff0c;算力网络在经济社会发展中扮演了愈来愈重要的角色&#xff0c;成为支撑数字经济蓬勃发展的“新引擎…

快手推荐算法工程师三面回顾

快手三次技术面试一次HR面试的简单回顾&#xff0c;希望对大家有所启发。 一面 面试官一上来就让写算法题&#xff0c;第一个是计算岛屿数量&#xff0c;第二个是最长回文字串。 然后就是介绍自己的论文。对于论文的工作&#xff0c;面试官只是在问关于论文的问题&#xff0…

STM32F4XX使用SWO实现printf功能

一 名词说明 SWO&#xff1a;Serial Wire Output&#xff0c;串行线输出 ITM&#xff1a;Instrumentation Trace Macrocell&#xff0c;仪器跟踪宏单元二 使用软件 1 keil 2 JLinkSWOViewer三 swo实现代码 #include "stm32f4xx_hal.h" #include "stdio.h&quo…

babel执行流程

babel简单执行流程 为了验证方便 这边 使用的命令是 babel src/index.js --out-file lib/index.compiled.js,这样可以定位 babel 中的files.js 相对目录比较简单 执行scripts 中的 build 命令 执行 package.json 中的scripts 命令 <!-- package.json 中的命令 -->"…