Redux 学习系列(一) —— 基础概念入门篇

news2024/12/24 9:12:48

简介

Redux 是一个可预测的 JavaScript 应用状态管理容器,也可以说是一个应用数据流框架。

作用

Redux 主要是用作应用状态的管理。它抽离所有组件的状态,构造一个中心化的单独常量状态树(对象)来保存这一整个应用的状态。这棵状态树与 React 组件树一一对应,相当于对 React 组件树进行了状态化建模:
在这里插入图片描述

  1. redux可以无视组件层级;
  2. 对于组件系统来说,redux就是一个第三方的,全局的“变量”。

特性

  • 可预测
    Redux 可以开发出行为稳定可预测、可运行在不同环境 (客户端、服务端和原生程序)且易于测试的应用。
  • 集中管理
    集中式存储和管理应用的状态,可以开发出强大的功能,如撤销/重做、 状态持久化等等。
  • 可调试
    Redux DevTools 可以轻松追踪到应用的状态在何时、何处以及如何改变。
  • 数据流清晰
    Redux 的架构可以记下每一次改变,借助于 “时间旅行调试”,甚至可以把完整的错误报告发送给服务器。
  • 灵活
    Redux 可与任何 UI 层框架搭配使用,并且有庞大的插件生态。

学习文档

Redux 中文官网

优点

在应用中使用 Redux 有如下好处:

  1. 预测
    始终有一个准确的数据源,就是 store,对于如何将 actions 以及应用的其他部分和当前的状态同步可以做到绝不混乱。
  2. 维护
    具备可预测结果的性质和严格的组织结构让代码更容易维护。
  3. 组织
    对代码应该如何组织更加严苛,这使代码更加一致,对团队协作更加容易。
  4. 测试
    编写可测试代码的首要准则就是编写可以仅做一件事并且独立的小函数。Redux 的代码几乎全部都是这样的函数:短小、纯粹、分离。
  5. 服务端渲染
    可以带来更好的用户体验并且有助于搜索引擎优化,尤其是对于首次渲染。仅仅是把服务端创建的 store 传递给客户端就可以。
  6. 开发者工具
    开发者可以实时跟踪在应用中正在发生的一切,从actions 到状态的改变。
  7. 社区与生态圈
    存在很多支持 Redux 的社区,使它能够吸引更多的人来使用。

核心概念

Redux 核心概念有三个:action、store、reducer

在这里插入图片描述

store

Redux 里面, Store 是一个仓库,整合 actionreducer,用来保存整个应用需要管理的数据 state 。(与vuexstore 意义上相似)

Redux 提供了一个 createStore 来创建 state。如下:

import { createStore } from 'redux';
// 创建 store
let store = createStore(rootReducer);
let authInfo = {username: 'admin', password: '123'};
store.dispatch(authUser(authInfo));

createStore 函数接受另一个函数作为参数,返回新生成的 Store 对象。

store 特点

  1. 有且仅有一个 store
  2. 维护应用的状态,获取状态:store.getState()
  3. 创建 store 时接收 reducer 作为参数:const store = createStore(reducer)
  4. 发起状态更新时,需要分发 action:store.dispatch(action)

store.getState()

store.getState() :获取 store 中存储的值

store.dispatch(action)

store.dispatch(action):派发动作,参数是一个动作对象 { type: 'xxx', data: xxx }

store.subscribe()

store.subscribe()Store 允许使用 store.subscribe 方法设置监听函数监听store 值的变化,一旦 State 发生变化,就自动执行这个函数。

在单个组件内监听 store 的状态变化:

// redux只维护状态,但是不会触发页面更新(不会触发组件render的调用)
// 检测redux中状态的变化,就调用render
store.subscribe(() => {
    this.setState({}); // 传入空对象,只为触发组件的render方法
});

如果每个组件都需要监听 store ,则可以在 index.js 入口文件监听 store,有变化则重新渲染 app 组件。

由于 reactdiff 算法,如果组件没有变化,不会更新所有的组件,不会引起页面重绘重排,所以不用担心效率问题。

解除监听

store.subscribe 方法返回一个函数,调用这个函数可以解除监听。

如下:

let unsubscribe = store.subscribe(() =>
  console.log(store.getState())
);

unsubscribe();

actions(动作)

Actions 就是事件,传递来自这个应用的视图层发起的一个操作(比如用户接口,内部事件比如 API 调用和表单提交),告诉 store 需要改变 state

Actions 提交数据给 storestore 只获取来自 Actions 的信息。

Action 描述了 action 的类型以及传递给 store 的负载信息,它有两个属性:

(1) type (通常是常量):标识属性,表示 action 的名称;

(2) payload :数据属性,可选。可以带一些参数,表示本次动作携带的数据,用作 Store 变更。

如下:

{
    type: LOGIN_FORM_SUBMIT,
    payload: {username: 'admin', password: '123'}
}

如上所示,定义了一个名为 LOGIN_FORM_SUBMITAction,还携带了payload 的参数。

Action Creator

View 要发送多少种消息,就会有多少种 Action。在Redux 中,可以用 Action Creator 生成器来批量生成一些 Action

function authUser(form) {
    return {
        type: LOGIN_FORM_SUBMIT,
        payload: form 
    }
}

store.dispatch()

Action 不会自己主动发出变更操作 Store,在应用中需要使用 dispatch 方法来调用 actions,它专门用来发出action

dispatch(authUser(form));

Redux里面,store.dispatch()View 发出 Action 的唯一方法。

action 特点

  1. 只描述做什么;
  2. JS 对象,必须带有 type 属性,用于区分动作的类型;
  3. 根据功能的不同,可以携带额外的数据,配合该数据来完成相应功能。

reducers

store.dispatch 发起了一个 action 之后,会到达 reducerreducer 获得这个应用的当前状态和事件并完成,经过计算,返回一个新的 state 状态对象给 store(这使得 Redux 非常简单以及可预测)。

在函数式 JavaScriptreducer 基于数组 reduce 方法,接收一个回调(reducer)可以从多个值中获得单个值,整数和,或者一个一系列值的累积。

如下:

function handleAuth(state, action) {
    return _.assign({}, state, {
        auth: action.payload  
    });
}

对于更多复杂的项目,推荐使用 Redux 提供的combineReducers() 实例。它把在这个应用中所有的reducer 结合在一起成为单个索引 reducer。每一个reducer 负责它自己那部分应用的状态,这个状态参数和其他 reducer 的不一样。combineReducers() 实例使文件结构更容易维护。

如下:

const rootReducer = combineReducers({
    handleAuth: handleAuth,
    editProfile: editProfile,
    changePassword: changePassword
});

如果一个对象 (state) 只改变一些值,Redux 就创建一个新的对象,那些没有改变的值将会指向旧的对象而且新的值将会被创建。这对性能是极好的。为了让它更有效率可以添加 Immutable.js

reducer 特点

  1. 是一个纯函数,可查看之前的状态,执行一个 action 并返回一个新的状态;
  2. 接收两个参数:当前的 state 和接收到的action,返回一个新的 state

纯函数的意思是说,对于相同的输入,只会有相同的输出,不会影响外部的值,也不会被外部的值所影响。

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

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

相关文章

Java经典笔试题—day02

Java经典笔试题—day02 🔎选择题🔎编程题🥝排序子序列🥝倒置字符串 🔎结尾 🔎选择题 (1)A 派生出子类 B , B 派生出子类 C ,并且在 java 源代码有如下声明: A a0new A(…

HTTPS协议介绍

文章目录 一、HTTPS协议的认识二、常见的加密方式1.对称加密2.非对称加密 三、数据摘要四、HTTPS的工作过程探究1.只使用对称加密2.只使用非对称加密3.双方都使用非对称加密4.非对称加密对称加密5.中间人攻击6.引入证书7.非对称加密对称加密证书认证 一、HTTPS协议的认识 HTTP…

【数据库】面试高频问题汇总及详细解答

【C语言部分】面试高频问题汇总及详细解答 【操作系统(Linux)】面试高频问题汇总及详细解答 【计算机网络】面试高频问题汇总及详细解答 本文目录 1. SQL1.1 介绍一下数据库分页1.2 介绍一下SQL中的聚合函数1.3 表跟表是怎么关联的1.4 说一说你对外连接的了解1.5 说说SQL中怎么…

VM虚拟机安装Ubuntu server 22.04网络问题

在使用vm虚拟机安装ubuntu server 22.04的时候会遇到一些网络问题,例如虚拟机内的Ubuntu不能上网,ping www.baidu.com不通,主机使用远程工具不能建立远程连接,Ubuntu ping本地主机不通,本地主机ping虚拟机也不通的问题…

vue3+vite项目优化。

最近开发的一个vue3vitets项目,build后发现体积过大,所以针对于项目体积进行一次优化。 一: 使用rollup-plugin-visualizer 可视化分析包 npm i rollup-plugin-visualizer -S 在vite.config.js中引入 在 plugins里面 然后执行npm run build就自动打开…

最新开源Chatgpt人工智能对话源码系统如何搭建?含详细安装教程分享和源码

人工智能对话系统市场需求正在不断增长。随着人们对智能化、自动化服务的需求不断提高,人工智能对话系统成为越来越多企业和组织的首选解决方案,可以有效提升用户体验、降低成本、提高效率。 一、Chatgpt人工智能对话源码系统定义 ChatGPT是一种基于深…

流量挂机赚钱项目Traffmonetizer

利用闲置电脑/服务器/安卓手机/树莓派来赚点电费 简介 Traffmonetizer是一个来自欧洲的流量挂机平台,类似Peer2profit,满10刀可提现(Paypal、BTC、Payoneer),注册好像就送5刀,Traffmonetizer不怎么占用CPU和内存以及流量&#x…

初学容器化

1.docker build,ship,run,any app anywhere docker类似运输中的集装箱,可以装任何应用(镜像文件),运行到各种服务器上。 docker提供的是进程上的隔离,虚拟机提供的是操作系统资源…

【五一创作】嵌入式Sqlite数据库【基本语法、Sqlite-JDBC、嵌入到Java程序】

目录 前言 基本介绍 Sqlite 对比 MySQL 字段类型 语法 创建表 插入数据 更新数据 查询数据 删除数据 查看建表语句 Sqlite-JDBC 嵌入到Java程序 前言 最近在用JavaFX做一个桌面软件需要用到数据库,但MySQL这种数据库明显只能本地访问,把软…

JVM-0502

垃圾回收 概述 内存的自动分配 垃圾收集,不是J8Va语音的件生产物。早在1968年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集有三个经典问题: 哪些内存需要回收?什么时候回收?(…

双金属复合圆管层间高温接触热阻测试方法的分析和选择

摘要:双金属复合圆管因其优越的特性在越来越多的领域得到广泛应用,而其层间接触热阻是这种圆管作为换热管时的重要性能指标。本文针对这种双金属复合圆管层间接触热阻的测试需求,分析和对比了现有用于接触热阻测试的各种稳态和瞬态方法&#…

网络应用基础 ——(2023新星计划文章一)

一,网络的概念 1.1网络及其带来的好处 (1)计算机网络是指通过通信设备和通信线路将多台计算机连接起来,以便实现资源共享、信息传递和协同工作的技术和系统。计算机网络是现代信息技术的重要组成部分,已经深入到我们…

代码随想录算法训练营第三十一天 | 贪心1,想不到怎么找局部最优就做不出来

贪心算法理论基础 代码随想录 (programmercarl.com) 贪心算法理论基础!_哔哩哔哩_bilibili 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额&#xff…

代码随想录刷题笔记3

文章目录 回溯细节模板题型组合分割子集排列棋盘问题N皇后问题解数独问题 其他 总结 回溯 本质上:穷举 剪枝。回溯法就是解决这种k层for循环嵌套的问题。 for循环横向遍历,递归纵向遍历,回溯不断调整结果集。 注意画出 解空间树-N叉树。 细…

无云服务器,Linux本地快速搭建web网站,并内网穿透发布上线(1)

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道,指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 转载自cpolar文章:Linux CentOS本地搭建…

【QT】 Qt高级——Qt自定义标题栏

【QT】 Qt高级——Qt自定义标题栏 一、Qt自定义标题栏简介 QWidget及其子类窗体组件的标题栏受操作系统的控制,即标题栏的界面风格与操作系统的主题风格相同,工程实践中需要开发者自行定义,达到美化应用程序界面的目的。 二、Qt自定义标题…

每日学术速递5.1

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Putting People in Their Place: Affordance-Aware Human Insertion into Scenes 标题:把人放在他们的位置:可供感知的人类插入场景 作者:Sumit…

项目管理:项目进度跟踪的好处有哪些?

项目进度跟踪主要针对项目计划、任务和项目成员三个方面,即为了了解整个项目计划完成情况、了解项目的实际进展情况、解成员工作完成情况。 项目跟踪可以证明计划是否可执行,可以说明计划是否可以被完成。 在项目执行过程中,我们也可以通过跟…

网络安全合规-Tisax(汽车安全评估讯息交换平台)一

**TISAX(汽车安全评估讯息交换平台(可信信息安全评估交换平台))**是2017年由德国汽车工业联合会(VDA) 联合欧洲网络交换所(ENX) 所推出的资讯交换平台,通过应用欧洲网络交换协会(ENX)和德国汽车…

rk3568 适配摄像头 (双摄)

rk3568 适配摄像头 (mipi 双摄) rk3568 适配双摄像其实就是逐个适配单摄像头,只是两颗摄像头的数据总线可能不同(cifmipi),也可能相同(mipi(2lane) x 2)。几乎相同的上电时许,不同的时钟信号和总线协议决定加载过程会略有不同。 提示&#…