Redux的讲解与教程

news2024/11/19 2:39:14

我们在学习和使用React做项目的时候,肯定离不开Redux的使用。那么 “Redux” 是什么呢?。它有什么作用?它帮助我解决什么问题?我为什么要使用它?搞懂这些能让我们更好的理解和使用Redux。

Redux 是什么?

Redux是一个用于JavaScript应用程序状态管理的开源库。它可以帮助你更好地组织和管理应用程序的状态,并提供可预测性和可维护性。

为什么需要使用Redux?(现实面临的问题)

在大型JavaScript应用程序中,随着应用程序变得复杂,状态管理变得困难。我们常见的React框架。它就存在着许多常见的问题例如
ac

  1. 共享状态困难:多个组件需要访问和共享同一个状态。当状态分散在应用程序的不同部分时,跟踪和管理状态变得困难,容易引发bug。a
  2. 状态更新难异常:状态可能被多个组件同时修改,导致状态的一致性问题。在没有明确规定的情况下,状态变更可能不可预测,难以维护和调试。
  3. 组件通信困难:组件之间需要进行复杂的通信和协调。在没有统一的机制来管理共享状态时,组件之间的通信变得困难,代码变得冗杂。

而我们的Redux就能帮助我们很好的解决这些问题。那么你可能有会问了为什么偏偏是Redux呢?为什么不能是
MobXZustand或者是Recoil呢?

Redux的优点

  • 高度的可预测性:Redux的状态管理遵循严格的单向数据流,所有的状态变更都是通过分发操作来进行的。这种一致的数据流模式使得状态变更变得可预测,容易理解和调试。

  • 强大的工具生态系统:Redux拥有丰富的工具和插件生态系统,包括Redux DevTools等。这些工具提供了强大的调试和开发工具,使得在开发过程中能够更好地理解应用程序的状态变化,进行时间旅行调试等。

  • 可扩展性和灵活性:Redux通过中间件机制提供了灵活的扩展能力。你可以使用中间件来处理异步操作、日志记录、路由等复杂逻辑,而无需修改核心的状态管理逻辑。这种可扩展性使得Redux适用于各种规模和复杂度的应用程序。

  • 状态的集中管理:Redux使用单一不可变状态树来管理整个应用程序的状态。这种集中化的状态管理使得状态变更更容易追踪和调试,避免了状态分散和不一致的问题。

  • 拥有成熟的社区和文档支持:Redux拥有庞大的社区和成熟的文档支持,你可以轻松找到大量的教程、示例和问题解答。这使得学习和使用Redux变得更加容易,有助于解决开发中的问题。

  • 组件解耦和可复用性:Redux将应用程序的状态从组件中解耦出来,通过容器组件和连接器(connectors)来连接组件和状态。这种解耦使得组件更加独立和可复用,减少了组件之间的直接依赖关系。你可以在任何地方使用相同的状态,并且组件可以专注于渲染和响应用户操作,而不必关心状态的细节。

我什么时候应该使用 Redux呢?

Redux 可帮助你处理共享状态的管理,但与任何工具一样,它也需要权衡利弊。使用 Redux 需要添加了一些额外代码,并要求你遵循某些限制。这是短期和长期生产力之间的权衡。

在以下情况下我们就应该使用 Redux:

  • 应用中有很多 state 在多个组件中需要使用
  • 应用 state 会随着时间的推移而频繁更新
  • 更新 state 的逻辑很复杂
  • 中型和大型代码量的应用,很多人协同开发

并非所有应用程序都需要 Redux。 花一些时间思考你正在构建的应用程序类型,并决定哪些工具最能帮助解决你正在处理的问题。

Reducer

在Redux中,Reducer 是一个纯函数,用于处理状态的更新。它接收当前的状态(previous state)和一个动作(action对象)作为参数,并返回一个新的状态(new state)。你可以将 reducer 视为一个事件监听器它根据动作的类型来决定如何更新状态。

使用规则

  • 禁止直接修改 state。必须通过复制现有的 state 并对复制的值进行更改的方式来做 不可变更新(immutable updates) 。这种方式可以确保Redux存储中的先前状态保持不变,以便进行状态的时间旅行和调试。
  • 纯函数:Reducer必须是纯函数。不能产生有副作用,不应该修改传入的参数,也不应该执行异步操作。Reducer的输出应仅依赖于输入的先前状态和动作,而不受其他外部因素的影响。

Store

在Redux中,Store 是一个包含应用程序状态的对象。它是整个Redux应用程序的核心部分,用于存储、更新和访问应用程序的状态。store 是通过传入一个 reducer 来创建的,并且有一个名为 getState 的方法,它返回当前状态值

使用规则

  • Store是唯一的:应用程序应该只有一个唯一的Store。
  • 使用store.getState()方法来获取当前的状态对象
  • 使用store.dispatch(action)方法来分发动作
  • 使用store.subscribe(listener)方法来注册一个监听器

Action

在Redux中,Action是一个包含type字段的普通JavaScript对象,用于描述应用程序中发生的动作。它是触发状态更新的唯一来源。

Action结构

Action对象通常具有以下结构:

{
type: 'ACTION\_TYPE',
payload: // 可选,用于携带数据或其他相关信息的字段
}
  • type字段是Action的类型,用于标识要执行的操作。它通常是一个字符串常量,表示应用程序中的某个动作。例如,type: 'INCREMENT’表示执行一个增加的动作。

  • payload字段是可选的,用于携带数据或其他相关信息。它可以是任何JavaScript值,如对象、数组、字符串、数字等。如果有需要,可以使用payload字段来传递需要用于状态更新的数据

Dispatch

在Redux中,dispatch是一个用于分发(触发)Action的方法。它是Redux Store对象的一个方法。
使用store.dispatch(action)语法,我们可以将一个Action分发到Redux的Store中,从而触发相应的状态更新

Selector

在Redux中,Selector是一个函数,用于从应用程序的状态中获取特定的数据。它可以帮助我们在应用程序的不同部分中选择和提取所需的数据,而不需要直接访问整个状态对象。

代码示例:

const selectCounterValue = state => state.value  
  
const currentValue = selectCounterValue(store.getState())  
console.log(currentValue)  
  • 在这个示例中,selectCounterValue是一个简单的Selector函数,它从Redux的状态中选择并返回value字段。

  • 首先,我们使用store.getState()方法获取当前的Redux状态。然后,我们将该状态作为参数传递给selectCounterValue函数,以获取value字段的值。

  • 最后,我们将得到的currentValue打印到控制台。

使用方法

  1. 定义初始状态值:首先,你需要定义一个初始状态对象。它表示应用程序的初始状态。例如:

    const initialState = {
      count: 0
    };
    
  2. 创建Reducer:创建一个Reducer函数来处理状态的更新。Reducer函数是一个纯函数,接收先前的状态和动作对象作为参数,并返回一个新的状态对象。根据动作的类型,Reducer决定如何更新状态。例如:

    const counterReducer = (state = initialState, action) => {
      switch (action.type) {
        case 'INCREMENT':
          return {
            ...state,
            count: state.count + 1
          };
        case 'DECREMENT':
          return {
            ...state,
            count: state.count - 1
          };
        default:
          return state;
      }
    };
    
  3. 创建Store:使用Redux提供的createStore函数来创建一个Store。将Reducer作为参数传递给createStore函数,这样Store就能够使用Reducer来处理状态的更新。例如:

    import { createStore } from 'redux';
    
    const store = createStore(counterReducer);
    
  4. 访问状态:通过调用store.getState()方法,你可以获取当前的状态对象。例如:

    const currentState = store.getState();
    
  5. 分发动作:要更新状态,你需要分发一个动作。动作是一个包含type字段的普通JavaScript对象,用于描述要执行的操作。使用store.dispatch(action)方法来分发动作并触发状态的更新。例如:

    const incrementAction = { type: 'INCREMENT' };
    store.dispatch(incrementAction);
    
  6. 监听状态变化:如果你希望在状态发生变化时执行一些操作,可以使用store.subscribe(listener)方法来订阅状态的变化。每当状态更新时,监听器函数将被调用。例如:

    const listener = () => {
      const currentState = store.getState();
      // 处理状态变化
    };
    
    store.subscribe(listener);
    

通过上述步骤,你就可以在Redux中使用Reducer来管理和更新状态了。Reducer定义了如何根据动作类型更新状态,Store负责存储状态并提供相关的方法来访问和更新状态。

Redux 的数据流

早些时候,我们谈到了“单向数据流”,它描述了更新应用程序的以下步骤序列:

  • State 描述了应用程序在特定时间点的状况
  • 基于 state 来渲染视图
  • 当发生某些事情时(例如用户单击按钮),state 会根据发生的事情进行更新
  • 基于新的 state 重新渲染视图

具体来说,对于 Redux,我们可以将这些步骤分解为更详细的内容:

  • 初始启动:

    • 使用最顶层的 root reducer 函数创建 Redux store
    • store 调用一次 root reducer,并将返回值保存为它的初始 state
    • 当视图 首次渲染时,视图组件访问 Redux store 的当前 state,并使用该数据来决定要呈现的内容。同时监听 store 的更新,以便他们可以知道 state 是否已更改。
  • 更新环节:

    • 应用程序中发生了某些事情,例如用户单击按钮
    • dispatch 一个 action 到 Redux store,例如 dispatch({type: 'counter/increment'})
    • store 用之前的 state 和当前的 action 再次运行 reducer 函数,并将返回值保存为新的 state
    • store 通知所有订阅过的视图,通知它们 store 发生更新
    • 每个订阅过 store 数据的视图 组件都会检查它们需要的 state 部分是否被更新。
    • 发现数据被更新的每个组件都强制使用新数据重新渲染,紧接着更新网页

动画的方式来表达数据流更新:

动画.gif

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

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

相关文章

setjmp和longjmp

使用这两个函数时&#xff0c;一定要牢记&#xff0c; longjmp函数是有去无回的&#xff0c;后面还有两个错误的使用示例。 #include <setjmp.h> int setjmp(jmp_buf env); void longjmp(jmp_buf env, int val); 基础例子&#xff1a; #include <setjmp.h> #inc…

XHbuilder 需要的 ipa 签名,超详细的教程,你不看吃亏的是自己!

今天使用 hbuilder 运行到 ios 真机的时候&#xff0c;突然发现还需要 ipa 签名&#xff0c;这是什么东东呢&#xff1f; 1、IPA 签名是什么&#xff1f; 因苹果公司禁止企业证书用于非企业内部开发者。所以开发者无法再使用DCloud的企业证书签名的标准运行基座。 运行标准基…

预约直播 | 展心展力MetaApp:基于DeepRec的稀疏模型训练实践

MetaApp-推荐广告研发部&#xff0c;主要负责 MetaApp 拳头产品 233 乐园的首页信息流的推荐和广告系统&#xff0c;是比较传统的推广搜组。本次议题介绍了 MetaApp-推荐广告研发部 从传统的TensorFlow&#xff08;cpu&#xff09;自研分布式ps方案&#xff0c;逐步迁移到使用…

智能安全配电装置伙房食堂中的应用

【摘要】伙房食堂是高频用火用电场所&#xff0c;用火用电设备集中&#xff0c;同时人流量密集&#xff0c;如果没有做好预防工作&#xff0c;则容易引发火灾&#xff0c;造成人员伤亡。智能安全配电装置作为一种安全配电产品&#xff0c;可以有效预防电气事故的发生&#xff0…

HttpRunner_参数化进阶

目录 一.获取返回包数据 二.调用其他接口返回值 三.yml文件 四.设置全局变量并引用 五.调用函数 六.参数化驱动(最简单的方式) 七.参数化驱动(复杂的方式)   八.使用指定的报告模板指定报告生成路径 九.保存测试过程数据 十.单独使用HttpRunner 一.获取返回包数据 …

QCN6274 QCN9274 What is the difference?|WIFI7 Solution|Wallys

QCN6274 QCN9274 What is the difference?|WIFI7 Solution|Wallys Q:QCN6274 QCN9274 What is the difference? A:The QCN6274 is a Qualcomm WiFi 7 chip, and Wallys is currently in the process of developing a WiFi module integrated with the QCN9274 chip. Its imp…

Pytorch实现多GPU并行训练(DDP)

Pytorch实现并行训练通常有两个接口&#xff1a;DP&#xff08;DataParallel&#xff09;和DDP&#xff08;DistributedDataParallel&#xff09;。目前DP&#xff08;DataParallel&#xff09;已经被Pytorch官方deprecate掉了&#xff0c;原因有二&#xff1a;1&#xff0c;DP…

浅聊Android性能优化~

作者&#xff1a;一只修仙的猿 前言 关于性能优化&#xff0c;可能我们的第一反应是这是高手做的事情&#xff0c;一直以来我也是这样认为的。但在最近一段时间&#xff0c;在公司项目上做了一些框架的性能优化&#xff0c;让我初步掀开了性能优化的面纱&#xff0c;也对他有了…

VirtualBox 部署 KVM 虚拟化

什么是KVM技术&#xff1f; KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一种开源的虚拟化技术&#xff0c;它是Linux内核的一部分。KVM通过将Linux内核转换为Hypervisor&#xff0c;允许在同一物理主机上运行多个虚拟机实例&#xff0c;每个实例可以独享一部分…

JAVA学习之String学习

1.底层是用什么实现的&#xff1f; JDK8用的char数组&#xff0c;JDK9开始使用byte数组,而且都是final型&#xff0c;所以不同字符串&#xff08;值&#xff09;的地址必然不同。 char和byte的区别&#xff1a;char是2个字节表示&#xff0c;而byte是一个字节。 JDK17中&…

Vue3解决:[Vue warn]: Failed to resolve component: el-table(或el-button) 的三种解决方案

1、问题描述&#xff1a; 其一、报错为&#xff1a; [Vue warn]: Failed to resolve component: el-table If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement. at <App> 或者&#xff1a; …

网络安全(黑客)自学

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员&…

kubectl-ai:K8S资源清单的GPT助手

琦彦&#xff0c;在 **云原生百宝箱 **公众号等你&#xff0c;与你一起探讨应用迁移&#xff0c;GitOps&#xff0c;二次开发&#xff0c;解决方案&#xff0c;CNCF生态&#xff0c;及生活况味。 kubectl-ai 项目是一个kubectl使用 OpenAI GPT 生成和应用 Kubernetes 清单的插件…

【APP自动化测试必知必会】Appium之微信小程序自动化测试

本节大纲 H5 与小程序介绍 混合 App 元素定位环境部署 混合 App 元素操作 Airtest 测试 App 01.H5与小程序介绍 H5概述 H5 是指第 5 代 HTML &#xff0c;也指用 H5 语言制作的一切数字产品。 所谓 HTML 是“超文本标记语言”的英文缩写。我们上网所看到网页&#xf…

Oculus创始人谈Vision Pro:苹果在硬件设计、营销都做对了选择

早在Vision Pro正式发布之前&#xff0c;Oculus创始人Palmer Luckey就已经体验过早期版本&#xff0c;并给出了极高的评价。Luckey指出&#xff0c;苹果在XR头显上的策略是明智的&#xff0c;先打造出每个人预期中的头显&#xff0c;然后再去考虑如何让大家买得起。 Vision Pro…

远程控制电脑软件VNC安装使用教程:Windows系统

什么是VNC&#xff1f; VNC (Virtual Network Console)&#xff0c;即虚拟网络控制台&#xff0c;它是一款基于 UNIX 和 Linux 操作系统的优秀远程控制工具软件&#xff0c;由著名的 AT&T 的欧洲研究实验室开发&#xff0c;远程控制能力强大&#xff0c;高效实用&#xff…

【python】python编程基础

基础工具包 python 原生数据结构元组 Tuple列表 list集合 set字典 dictionary NumPy 数据结构数组 Ndarray矩阵 Matrix Pandas 数据结构序列 Series &#xff08;一维&#xff09;数据框 DataFrame &#xff08;二维&#xff09; Matplotlib 数据可视化绘制饼图绘制折线图绘制直…

《Linux操作系统编程》 第六章 Linux中的进程监控: fork函数的使用,以及父子进程间的关系,掌握exec系列函数

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

一文读懂高分文章必备分析-GSEA

Gene Set Enrichment Analysis 或称 GSEA&#xff0c;是一种常用于转录组基因表达分析的数据挖掘技术&#xff0c;已经在《nature》、《Cell》、《ISME》、《Molecular Cell》、《Bioactive Materials》等高分杂志中发表多篇文章&#xff0c;涉及转录组及多组学内容。 凌恩生物…

yxcms存储型XSS至getshell 漏洞复现

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 环境部署02 漏洞配置03 利用方式04 修复方案 01 环境部署 &#xff08;1&#xff09;yxcms yxcms 基于 PHPMySQL 开发&#xff0c;这是一个采用轻量级 MVC 设计模式的网站管理系统。轻量级 MVC 设…