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

2023-05-16

简介

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redux 学习系列(一) —— 基础概念入门篇 的相关文章

  • 配置Ubuntu软件源

    引子 Ubuntu系统的软件源就是指Ubuntu系统的软件更新管理器下载更新软件的来源 xff0c 是一个软件仓库 Ubuntu系统对这个软件源的配置的信息是放在一个文本文件中的 xff0c 这个文本文件的完整路径一般是 etc apt s
  • NuttX 启动流程

    xff08 嵌入式 实时操作系统 rtos nuttx 7 1 stm32 源代码分析 xff09 NuttX 启动流程 转载请注明出处 xff1a http blog csdn net zhumaill article details 2
  • NuttX 介绍

    xff08 嵌入式 实时操作系统 rtos nuttx 7 1 xff09 NuttX 介绍 转载请注明出处 xff1a http blog csdn net zhumaill article details 24197637 1 Nutt
  • Ubuntu用命令行打开网页的三种方法

    1 第一种方法 links命令 apt install links links websol cn 2 第二种方法 w3m命令 apt install w3m w3m websol cn 3 第三种方法 lynx命令 apt install
  • JS删除数组中指定元素/删除数组中指定对象

    删除数组中指定对象指定元素 let arr 61 name 34 xiaowang 34 id 1 name 34 xiaozhang 34 id 2 createDate 34 xiaoli 34 id 3 删除id为1的对象 xff0c
  • React G2Plot 水波图

    官方文档 xff1a https antv g2plot v1 gitee io zh docs manual introduction 安装依赖 span class token function npm span span class
  • 数据链路层

    本篇目录 数据链路层的三个基本问题 使用点对点信道的数据链路层 使用广播信道的数据链路层 以太网MAC层的硬件地址 一 数据链路层的三个基本问题 封装成帧 xff1a 帧是数据链路层的传送单位 一个帧的帧长等于帧的数据部分加上帧的首部和尾部
  • 输入三个数求出最大值(5种方法)

    这是一个很简单的C语言程序 xff0c 重要的是考验思考问题的角度 xff1a 方法1 xff1a include lt stdio h gt void main int a b c scanf 34 d d d 34 amp a amp
  • 把二维数组数据读入txt文本(C语言)

    我们经常需要把计算后的数据存入txt文本 xff0c 下例提供了一种简单思路 xff1a include lt stdio h gt include lt stdlib h gt int main int a 2 3 61 5 2 8 4
  • 查询txt文本信息行数(C和C++分别实现)

    在一些程序设计中 xff0c 我们经常要先查询txt文本的行数 xff0c 据此 xff0c 才能对数组进行动态内存分配 C语言实现 include lt stdio h gt include lt stdlib h gt define A
  • 从txt中读取数据存入二维数组

    在实际应用中 xff0c 经常需要把txt中的数据读入到一个数组中 xff0c 然后再参与运算 在C语言中可以利用fscanf 函数从文件中读取数据 xff0c 示例如下 xff1a void main xff08 xff09 double
  • 仿射变换

    AffineTransform类描述了一种二维仿射变换的功能 xff0c 它是一种二维坐标到二维坐标之间的线性变换 xff0c 保持二维图形的 平直性 xff08 译注 xff1a straightness xff0c 即变换后直线还是直线
  • OpenCV下的直线拟合

    出处 xff1a http blog csdn net Tangyongkang OpenCV中 CvSeq 对象由以下语句生成 创建 CvSeq的容器对象 CvMemStorage storage 61 cvCreateMemStorag
  • 利用meshgrid函数绘制二维高斯函数曲面

    meshgrid函数用于根据给定的横纵坐标点生成坐标网格 xff0c 以便计算二元函数的取值 设二维高斯函数表达式为 xff1a 程序如下 xff1a u 61 10 0 1 10 v 61 10 0 1 10 U V 61 meshgri
  • 要想成功必备的9大好习惯 以及必须克服的9个坏习惯

    要想成功 必备 9 大好习惯 以及 必须克服的 9 个坏习惯 你想成功吗 xff1f 那就及早培养有利于成功的好习惯 习惯的力量是惊人的 xff0c 35岁以前养成的习惯决定着你是否成功 有这样一个寓言故事 一位没有继承人的富豪死后将自己的
  • 数据结构算法学习之路

    1 二分法竞猜商品价格 include lt stdio h gt include lt stdlib h gt int main int oldprice price 61 0 i 61 0 printf 34 请设置商品的真实价格 xf
  • React markdown 编辑器

    react markdown 是一款 github 上开源的适用于 react 的 markdown 组件 xff0c 可以基本实现 markdown 的功能 xff0c 且可以根据自己实际应用定制的 remark 组件 安装 安装 mar
  • ROS下IMU串口通讯接口(通用版)

    1 源码 include lt string gt include lt ros ros h gt 包含ROS的头文件 include lt sensor msgs JointState h gt include lt tf transfo
  • openrave安装 win7(10)

    1 软件安装 1 xff09 其中 xff0c boost 1 44需独立编译 xff0c 放到指定文件夹下 xff0c 例如 D boost 1 44 0 xff1b 2 xff09 ps 最大的坑在这里 xff0c 务必把msvc bo
  • 嵌入式常见的数据结构

    0 引言1 线性表1 1 顺序表1 1 1 定义类型1 1 2 相关操作1 1 3 相关操作的实现 1 2 链表1 2 1 定义类型1 2 2 相关操作1 2 3 相关操作的实现 2 栈2 1 顺序栈2 1 1 定义类型2 1 2 相关操作

随机推荐

  • vslam

    目录 隐藏 1 SLAM 介绍 1 1 什么是SLAM 1 2 SLAM与视觉里程计 xff08 Visual Odometry xff09 1 3 SLAM和SfM 2 主流开源SLAM方案 2 1 视觉传感器 2 2 激光传感器 2 3
  • 华为mate手机从解锁到root成功全步骤

    警告 请保持电量充足 xff0c 不然小心变砖 解锁手机会恢复出厂设置 xff0c 原因未知 xff08 伤心 xff0c 不想查了 xff09 xff0c 请需要解锁的diy爱好者 xff0c 自行备份数据 一 安装adb驱动 下载安装a
  • <Zhuuu_ZZ>HIVE(十一)函数

    Hive内置函数 一 Hive函数分类二 字符函数二 类型转换函数和数学函数三 日期函数四 集合函数五 条件函数六 聚合函数和表生成函数6 1 聚合函数6 2 表生成函数 xff1a 输出可以作为表使用 一 Hive函数分类 从输入输出角度
  • 嵌入式软件工程师的自我修养: Cortex-M3 ARM代码编译,链接与启动过程深度分析

    本篇文章以武汉杰开科技的汽车级MCU芯片AC7811为硬件平台 xff0c 使用GNU GCC作为开发工具 详细分析Compile Link Loader的过程以及Image 二进制程序 启动的详细分析 整个过程分析涉及到RW可读写DATA
  • STM32F103C8T6驱动ESP8266转串口模块(一)——模块AP模式+TCP客户端的HAL库驱动代码详解(CubeMX工程)

    1 STM32驱动ESP8266模块 笔者所使用的ESP8266模块为正点原子开发的模块 xff0c 该模块将通信接口变成了串口 接下来关于ESP8266模块的介绍均以此模块为基础 1 1 CubeMX配置STM32F103C8T6芯片引脚
  • spring cloud 问题记录(十五) Unauthorized grant type: authorization_code

    在使用授权码的方式获取code的时候出现如下异常 xff1a org springframework security oauth2 common exceptions InvalidClientException Unauthorized
  • 如何提高MATLAB的运算速度

    将提高MATLAB运算速度的途径总结为以下几点 xff1a 1 硬件方面 xff1a CPU配置高一些 xff1b 2 利用Profiler评估程序 xff0c 查找出函数花费时间较多的地方优化 xff1b 3 尽量少使用for或者whil
  • webpack5 学习系列 —— 支持 Vue

    接之前的 webpack 学习系列 安装 Vue xff1a span class token function npm span i vue S 安装完成 xff1a 安装相关插件 xff1a vue loader xff1a 解析和转换
  • Keil : Error-Flash Download failed Cortex-M4错误解决方案整理(J-Flash擦除下载教程)

    记录一下碰到的问题解决方法 第一步 xff1a 首先最先要确定的是芯片和设置是否对应 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 第二步 xff1a 确定芯片和设置对应无误后
  • js闭包理解与基本实现

    简单理解 xff1a 闭包就是 61 内层函数 43 外层函数的变量 内层函数 用到了外层函数的变量 所以才会产生了闭包 lt script gt function fn let a 61 1 function f console log
  • 头文件atlstr.h使用错误问题

    我的代码编译时出现如下错误 xff1a Error 33 fatal error LNK1120 1 unresolved externals Error 32 error LNK2001 unresolved external symbo
  • ubuntu编译服务器搭建

    我们现在开始做Android项目 xff0c 编译Android源码必不可少 但是Android编译需要Linux平台 xff08 一般都采用ubuntu xff09 xff0c 而且各种环境搭建繁杂 xff0c 编译时间长 xff0c 占
  • 和程序员有些不解之缘

    没来由的想起九年前的六月七 xff0c 不管是谁或许都不会想到一个青涩俏皮的丫头会变成铁铮铮的 汉子 高考那年我没发现自己有些许紧张 xff0c 在那之前我几乎没带着脑袋活着 xff08 我是那么想的 xff09 xff0c 觉着自己不在乎
  • SWDL学习篇

    WSDL 学习篇 1 什么是WSDL WSDL 是网络服务描述语言 xff0c 使用xml 编写 xff0c 是xml 文档 xff0c 可规定服务的位置以及提供服务的操作和方法 2 WSDL 文档结构 1 lt portType gt 元
  • linux面试题

    1 在Linux系统中 以 文件 方式访问设备 2 Linux内核引导时 从文件 etc fstab 中读取要加载的文件系统 3 Linux文件系统中每个文件用 i节点 来标识 4 全部磁盘块由四个部分组成 分别为 引导块 专用块 i节点表
  • MySql学习笔记(一)MySql卸载和安装说明

    MySql卸载 开始 控制面板 程序和功能 MySQL server xx 卸载 删除 C Program Files x86 MySQL 文件 删除 C ProgramData MySQL 文件 xff08 隐藏目录 xff09 如果以上
  • MySql学习笔记(二)MySql配置文件和服务操作说明

    Mysql配置文件说明 MySQL MySQL ServerX X my ini mysqld 为服务端配置 xff0c 服务端端口号 port 61 3306 安装目录 basedir 61 34 C Program Files MySQ
  • MySql学习笔记(三)MySql常用命令说明

    一 数据库命令 1 1显示数据库命令 命令 xff1a mysql gt show databases 执行后 xff1a 43 43 Database 43 43 information schema mysql performance
  • 什么是源端口和目的端口

    源端口就是指本地端口 目的端口就是远程端口 一个数据包 xff08 pocket xff09 被解封装成数据段 xff08 segment xff09 后就会涉及到 连接上层协议的端口问题 很多人都在源端口和目的端口这两个概念上犯迷糊 xf
  • Redux 学习系列(一) —— 基础概念入门篇

    简介 Redux 是一个可预测的 JavaScript 应用状态管理容器 xff0c 也可以说是一个应用数据流框架 作用 Redux 主要是用作应用状态的管理 它抽离所有组件的状态 xff0c 构造一个中心化的单独常量状态树 xff08 对