如何快速上手react中的redux管理库

news2024/11/25 14:52:13

前言:
什么是redux?redux和vuex一样,都被统称为状态管理库,是核心数据存贮与分发、监听数据改变的核心所在。
可以简单说下redux和vuex的区别:

相同点

  • state 共享数据
  • 流程一致:定义全局state,触发,修改state
  • 原理相似,通过全局注入store。

不同点

  • vuex定义了state、getter、mutation、action四个对象;redux定义了state、reducer、action。

  • vuex触发方式有两种commit同步和dispatch异步;redux同步和异步都使用dispatch

  • vuex中state统一存放,方便理解;reduxstate依赖所有reducer的初始值

  • vuex有getter,目的是快捷得到state;redux没有这层,react-redux mapStateToProps参数做了这个工作。

  • vuex中mutation只是单纯赋值(很浅的一层);redux中reducer只是单纯设置新state(很浅的一层)。他俩作用类似,但书写方式不同

  • vuex中action有较为复杂的异步ajax请求;redux中action中可简单可复杂,简单就直接发送数据对象({type:xxx, your-data}),复杂需要调用异步ajax(依赖redux-thunk插件)。

  • Redux 使用的是不可变数据,而Vuex的数据是可变的。Redux每次都是用新的state替换旧的state,而Vuex是直接修改

  • Redux 在检测数据变化的时候,是通过 diff 的方式比较差异的,而Vuex其实和Vue的原理一样,是通过 getter/setter来比较的

vuex 数据交互 思维图:
在这里插入图片描述
redux数据交互思维图:
在这里插入图片描述

接下来详细说说redux:

配置总共分为三部分

一.actions:负责收集并向reduces提交state的变化,自身可分为两部分actions类型和actions函数创建

(1)actions —type 常量类型,主负责向reduces
(2)actions —fn 函数创建 组件中触发提交函数

二.reducers 更新state状态,可根据state数据类型拆分成单个reducer,把reducers细化,后面通过集合构建出最终的大state
三.全局只需要有一个store,不需要像网站中资料介绍的在每一个组件一样去初始化一个store,一个项目集合在这初始化一次就可以;
  1. store.dispatch() // 提交
  2. store.sbuscribe() // 组件中监听reducer的变化,即state的变化回调
  3. store.getState() // 获取state的值,通常和store.sbuscribe() 结合使用

源码部分:

目录配置
在这里插入图片描述

actions:

index.js

/* actions 类型
* TYPE_GET_LIST 这是一个关于点击类型获取列表的定义
*/
import {TYPE_GET_LIST,IS_LOGIN} from "./type"


/* actions 创建函数
*actions 创建函数和actions是两个概念
*/
export function getType(opt){
  return {type: TYPE_GET_LIST, opt}
}
export function isLogin(flag){
  return {type: IS_LOGIN, flag}
}

type.js

/* actions 类型type */
export const TYPE_GET_LIST = "TYPE_GET_LIST";
export const IS_LOGIN = "IS_LOGIN";

/* 其他常量 */
export const otherType = {
  TO_DO: "TO_DO"
}
reducers

index.js

/**
 * redux 管理入口
 */
import {combineReducers} from "redux"
import userBasketReducer from './userReducer';
import {TYPE_GET_LIST, IS_LOGIN} from "../actions/type"

/* 不同数据结构的单个state */
function typeInfo(state={}, action) {
  console.log(state, action, "这个是tyInfo的信息");
  switch (action.type) {
    case TYPE_GET_LIST: return Object.assign({}, state, {typeInfo: action.opt});
    default: return state;
  }
};
function isLogin(state=false, action) {
  console.log(state, action);
  switch (action.type) {
    case IS_LOGIN: return Object.assign({}, state, {isLogin: action.flag});
    case ....; // 
    default: return state;
  }
};

// 汇总成一个大的state,供全局使用
const reducers = combineReducers({
  userBasket: userBasketReducer,
  typeInfo,
  isLogin
});

export default reducers;

store
import { createStore } from 'redux'
import reducers from '../reducers'
const store = createStore(reducers)

export default store;

至此,一个完整的redux搭建成功,需要拓展什么样的业务只需要根据自己的业务定义常量函数名和创建函数就可以了,然后通过在组件中dispatch分发的方式提交,就能直接挂载到state对象上供组件间相互使用。

接下来看看如何在组件中使用:
如何提交:
在组件中引入store库,和函数创建的方法

import {isLogin} from "../../redux/actions"
import store from "../../redux/store";

// 提交
store.dispatch(isLogin({flag: true})) // 登录成功赋值更新已登录逻辑

如何动态获取监听改变的值监听,全局监听state的值

import store from "../../redux/store";
store.subscribe(() => {
			const { selectedFolderId } = store.getState().selectedFolderId;
			this.setState({
				checkFolderId: selectedFolderId
			});
	});

Redux 将组件区分为 容器组件 和 UI 组件

  • 前者会处理逻辑
  • 后者只负责显示和交互,内部不处理逻辑,状态完全由外部掌控

Provider

看我上边那个代码的顶层组件4个字。对,你没有猜错。这个顶级组件就是Provider,一般我们都将顶层组件包裹在Provider组件之中,这样的话,所有组件就都可以在react-redux的控制之下了,但是store必须作为参数放到Provider组件中去

<Provider store = {store}>
    <App />
<Provider>

这个组件的目的是让所有组件都能够访问到Redux中的数据。

connect 的使用:

connect(mapStateToProps, mapDispatchToProps)(MyComponent)

mapStateToProps 把Redux中的数据映射到React中的props中去。
如:

    const mapStateToProps = (state) => {
      return {
      	// prop : state.xxx  | 意思是将state中的某个数据映射到props中
        foo: state.bar
      }
    }

组件中:

class Foo extends Component {
    constructor(props){
        super(props);
    }
    render(){
        return(
        	// 这样子渲染的其实就是state.bar的数据了
            <div>this.props.foo</div>
        )
    }
}
Foo = connect()(Foo);
export default Foo;

mapDispatchToProps 把各种dispatch也变成了props让你可以直接使用

const mapDispatchToProps = (dispatch) => { // 默认传递参数就是dispatch
  return {
    onClick: () => {
      dispatch({
        type: 'increatment'
      });
    }
  };
}
class Foo extends Component {
    constructor(props){
        super(props);
    }
    render(){
        return(
        	
             <button onClick = {this.props.onClick}>点击increase</button>
        )
    }
}
Foo = connect()(Foo);
export default Foo;

可以直接通过this.props.onClick,来调用dispatch,这样子就不需要在代码中来进行store.dispatch了

如果哪儿不懂可以留言我会快速回复,拆分的比较细,有些地方可能没必要拆分,完全是为了自己练习和做个笔记,也方便大家阅读,不足之处请指教互相交流学习

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

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

相关文章

【DELM回归预测】基于matlab粒子群算法改进深度学习极限学习机PSO-DELM数据回归预测【含Matlab源码 1884期】

⛄一、PSO-DELM简介 1 DELM的原理 在2004年&#xff0c;极限学习机&#xff08;extreme learning machine,ELM&#xff09;理论被南洋理工大学的黄广斌教授提出&#xff0c;ELM是一种单隐含层前馈神经网络&#xff08;single-hidden layer feedforward neural network,SLFN&am…

静态HTML个人音乐网页 大学生网页设计作业 简单音乐娱乐网页制作 DW个人网站模板下载 大学生简单音乐网页作品代码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

基于风驱动算法改进的DELM预测-附代码

风驱动算法改进的深度极限学习机DELM的回归预测 文章目录风驱动算法改进的深度极限学习机DELM的回归预测1.ELM原理2.深度极限学习机&#xff08;DELM&#xff09;原理3.风驱动算法4.风驱动算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理 ELM基础原理请参考&#xff1…

12月编程语言排行榜,java跌至低点,低代码发展迅猛

2022年12月编程语言排行榜&#xff1a;TIOBE Index for December 2022 TIOBE揭晓了12月全球编程语言排名&#xff0c;Python 以0.1%微弱优势领先C语言&#xff0c;成功夺冠。目前&#xff0c;这两种语言竞争焦灼&#xff0c;都是多次霸榜。 本次榜单&#xff0c;C作为一匹黑马…

chrome插件开发之发送网络请求v3版本

如果某个扩展希望访问自己所属域以外的资源&#xff0c;比如说来自http://www.google.com的资源(假设该扩展不是来自www.google.com), 浏览器不会允许这样的请求&#xff0c;除非该扩展获得了相应的跨域请求允许。 获取跨域请求允许 通过添加域名或者域名匹配到manifest文件的p…

CentOS 8:Redis服务器

Redis &#xff0c;一款基于内存的键值型数据库服务器 常见于网站开发场景 Redis 服务器只发布了 Linux 版本 Redis服务器的安装&#xff0c;有3种办法&#xff1a; 1 自动安装 , redis 5.0 yum install redis 2 源码方式 从官网下载源码&#xff0c;先编译、后部署 3 …

WhaleDI数据治理利器之“低成本数据质量管理”

数字化时代&#xff0c;数据已经成为企业管理的关键要素&#xff0c;随着数据的日益增长及汇聚&#xff0c;企业数据质量问题成为数据治理的关键。数据质量直接影响到能否通过数据分析驱动企业生产、运营、服务提效及创新。高质量的数据对管理决策、业务支撑等都有极其重要的作…

时间序列的研究

更多的时间预测&#xff0c;参考 https://github.com/qingsongedu/awesome-AI-for-time-series-papers#AI4TS-Tutorials 1. 周期检测模块 可能存在的情况&#xff0c; 单周期多周期无周期&#xff1b; Robust Period 检测 该时间序列&#xff0c;是否有周期 以及周期的长度…

C语言浮点型的存储

3.14159 1e10可以写成1.010的10次方 1e5 表示 1.010的5次方 int main() {int n 9;//4bytefloat* pFloat (float*)&n;//float 指针访问4的字节printf("n值为:%d", n);//9printf("*pFloat值为:%f\n", *pFloat);//&#xff0c;是以浮点数的视角去看的*p…

深度学习基础知识---梯度弥散 梯度爆炸

目录 1 梯度弥散、梯度爆炸的成因 2 解决方式 2.1.pretrainfinetune 2.2 梯度裁剪 2.3 权重正则化 2.5 Batch Normalization正则化 2.6 残差结构 shortcut 2.7 LSTM 1 梯度弥散、梯度爆炸的成因 神经网络的层&#xff08;主要是隐藏层&#xff09;越多&#xff0c;对…

【LSTM时序预测】基于matlab EMD结合LSTM风速数据预测【含Matlab源码 2051期】

⛄一、EMD-DELM简介 1 方法及原理 1.1 EMD基本原理 经验模态分解可基于数据本身&#xff0c;将复杂信号分解为一系列IMF和一个r(t),分解信号时&#xff0c;不需要预先设置任何基函数。因为这一特点&#xff0c;理论上EMD方法可预处理任何一种信号的数据&#xff0c;因此被广泛…

【Linux磁盘管理】

Linux磁盘管理 写在前面 在此强调一个 Linux 的核心机制就是一切皆文件。 I/O Ports 即I/O 设备地址&#xff0c;用来标识硬件对应的设备地址&#xff0c;来让操作系统以及 cpu 使用。 CPU 的核数不一定就是越多越好&#xff0c;由于CPU 协调之间的协调问题&#xff0c;可能性…

洛谷P1161 开灯

开灯 题目描述 在一条无限长的路上&#xff0c;有一排无限长的路灯&#xff0c;编号为 1,2,3,4,…1,2,3,4,\dots1,2,3,4,…。 每一盏灯只有两种可能的状态&#xff0c;开或者关。如果按一下某一盏灯的开关&#xff0c;那么这盏灯的状态将发生改变。如果原来是开&#xff0c;…

定时器/计数器中定时/计数初值的计算

寄存器TMOD是单片机的一个特殊功能寄存器&#xff0c;其功能是控制定时器/计数器T0、T1的工作方式。它的字节地址为89H&#xff0c;不可以对它进行位操作。 只能进行字节操作&#xff0c;即给寄存器整体赋值的方法设置初始值&#xff0c;如TMOD0x01。在上电和复位时&#xff0c…

中小型企业HR人力资源管理系统源码带使用手册和操作说明

【程序语言】&#xff1a;.NET 【数据库】&#xff1a;SQL SERVER 2008 【运行环境】&#xff1a;WINDOWSIIS 【其他】&#xff1a;前端bootstrap框架 运行环境 系统运行环境&#xff1a;ASP.NET 4.0/IIS 6.0/SQL Server2008&#xff0c;使用成熟稳定的Webform开发模式&…

【现代密码学原理】——期末复习(冲刺篇)

&#x1f4d6; 前言&#xff1a;快考试了&#xff0c;做篇期末总结&#xff0c;都是重点与必考点。 博主预测考点&#xff1a; 计算题&#xff1a;RSA、Diffie-Hellman密钥交换、EIGamal 密钥交换、使用SHA-512算法&#xff0c;计算消息的Hash值、计算消息的HMAC 应用题&#…

1.cesium简介和环境搭建

目录 一、cesium介绍 cesium是什么&#xff1f; cesium能做什么&#xff1f; cesium的限制&#xff1f; cesium的好处是什么&#xff1f; 二、创建一个简单的cesium 安装node环境 下载cesiumSDK 部署cesium 三、补充说明 Documentation Sandcastle 一、cesium介绍 …

重点| 系统集成项目管理工程师考前50个知识点(7)

本文章总结了系统集成项目管理工程师考试背记50个知识点&#xff01;&#xff01;&#xff01; 帮助大家更好的复习&#xff0c;希望能对大家有所帮助 比较长&#xff0c;放了部分&#xff0c;需要可私信&#xff01;&#xff01; 46、项目合同签订的注意事项&#xff1a; …

Hadoop实训1:Linux基本搭建和操作

目录 1、创建三台虚拟机 2、创建使用SSH远程连接 3、实现IP地址与主机名的映射 4、关闭和禁用防火墙 5、创建目录结构 6、压缩打包 7、安装软件包 安装jdk 安装mysql 8、创建脚本文件 9、运行脚本文件 11、远程拷贝文件 总结 1、创建三台虚拟机 序号虚拟机名称…

22.12.19打卡 Codeforces Round #839 (Div. 3) A~E

Dashboard - Codeforces Round #839 (Div. 3) - Codeforces 浑浑噩噩的一场, 被队友带飞 A 不解释 /* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠸⣿⣿⣆⠹⣿⣿⢾⣟⣯⣿⣿⣿⣿⣿⣿⣽⣻⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣻⣽⡿⣿⣎⠙⣿⣞⣷⡌⢻…