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

简介

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.mfbz.cn/a/17974.html

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

相关文章

java 学习日记

今天先搞题目 给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] [xi, yi] 。 连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| |yi - yj| ,其中 |val| 表示 val 的绝对值。 请你返回将所…

TikTok选品要怎样才能选到爆品?!

对于做TikTok的商家而言,选品是非常重要的,因为一个产品爆了之后能带动其他产品的销量,那我们要如何有效的选品呢? 一、多平台选品逻辑 首先要知道一个点,在独立站爆的品也会在亚马逊爆,而TikTok已经成为一…

4D成像雷达风口,谁在快速崛起?

4D成像雷达正进入规模量产落地的关键窗口期。 高工智能汽车注意到,毫米波雷达的发展某种程度上可以分为两个阶段:第一个阶段,传统毫米波雷达时代,市场基本被博世、大陆、安波福等国际Tier1巨头把持,市场格局长期稳固&…

PyTorch数据加载工具:高效处理常见数据集的利器

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else

场景 设计模式-策略模式在Java中的使用示例: 设计模式-策略模式在Java中的使用示例_java 策略模式示例_霸道流氓气质的博客-CSDN博客 上面讲了策略模式在Java中的使用示例。 下面看一个在SpringBoot中的实际使用示例。 业务场景: 有多个煤矿,信号灯…

智安网络|网络安全威胁越来越多,教你如何全方面应对

随着互联网的普及和发展,各大网站已经成为人们获取信息和交流的主要平台。然而,随着网络攻击和恶意软件的威胁不断增加,网站经常成为攻击者的目标。因此,在建立和维护网站系统时,必须采取强大的安全措施。 一、网站系…

第四十二章 Unity 下拉框 (Dropdown) UI

本章节我们介绍下拉框 (Dropdown),我们点击菜单栏“GameObject”->“UI”->“Dropdown”,然后调整它的位置,效果如下 其实它的本质就是一个下拉列表,然后选择列表中的一个选项而已。大家在很多网页中应该可以看到类似的UI元…

Vue框架

目录 简单介绍 MVVM 下载安装Node.js 安装Vue.js插件 新建Vue.js项目 下载vue依赖库 Vue工程目录结构 修改代码模板 vue组件中,添加模型数据 Vue双向绑定 动态绑定 vue组件中,显示图片 单选框绑定 复选框绑定 Vue的script表达式 Vue实例声…

MySQL概述 -- 数据模型SQL简介DDL数据库操作

一. 数据模型 介绍完了Mysql数据库的安装配置之后,接下来我们再来聊一聊Mysql当中的数据模型。学完了这一小节之后,我们就能够知道在Mysql数据库当中到底是如何来存储和管理数据的。 在介绍 Mysql的数据模型之前,需要先了解一个概念&#x…

【Linux】进程地址空间

目录 引入 进程地址空间 虚拟地址与物理地址 如何理解虚拟地址的不同区域 写时拷贝 动态开辟的细节 为什么存在进程地址空间 避免地址被随意访问 进程管理和内存管理解耦合 使进程用统一的视角看待代码和数据 引入 🎃我们写一个这样的程序,运…

算法记录 | Day50 动态规划

123.买卖股票的最佳时机III 思路: 1.确定dp数组以及下标的含义 最多可完成两笔交易意味着总共有三种情况:买卖一次,买卖两次,不买卖。 具体到每一天结束总共有 5 种状态: 未进行买卖状态;第一次买入状…

springboot - spring.factories

spring.factories 是什么? spring.factories 是 Spring Boot 自动配置的核心机制之一,它用于自动注册 Spring Boot 中的各种自动配置类,从而实现自动化配置的目的。在 Spring Boot 应用程序启动时,Spring Boot 会自动扫描 classp…

深度解读:《数字孪生世界白皮书(2023)》全方位剖析

2023年初,中国信息通信研究院发布了《数字孪生城市产业图谱研究报告(2022)》,报告中提出我国数字孪生产业四阶段体系,2020年到2030年是我国数字孪生产业增长期,当前数字孪生市场需求和技术均处于高速发展阶…

5月跳槽有风险,不跳也有?

今天讲讲跳槽。 说实话跳槽是为了寻求更好的发展,但在跳槽前我们也不能确定下家就是更好的归宿,这就更加需要我们审慎地去对待,不能盲目跳槽。 其次,我们离职和跳槽,其中的原因很大一部分是目前薪资不符合预期。 那…

C. Permutation Game(博弈 + 拓扑的思想)

Problem - C - Codeforces 经过漫长的一天, Aice和Bob决定玩一个小游戏。游戏棋盘由n个格子组成,在一条直线上,编号从1到n,每个格子包含一个数字4;,qy在1到n.之间,而且没有两个格子包含相同的数字。 一个棋子被放在其中一个格子里…

什么牌子蓝牙耳机好用不贵?国产性价比高的蓝牙耳机推荐

相较于有线耳机,无线蓝牙耳机更便携、功能更丰富,不用受到耳机孔与线的限制。那么,什么牌子的蓝牙耳机好用不贵?针对这个问题,我给大家推荐几款国产性价比高的蓝牙耳机,可以当个参考。 一、南卡小音舱Lite…

Spring使用注解存储和读取对象

文章目录 一、存储Bean对象配置扫描添加注解存储Bean对象注解使用范围Bean的命名五大类注解的关系为什么需要五大类注解? 二、方法注解BeanBean重命名 三、对象注入属性注入Setter注入构造方法注入Autowired 和 Resource 的区别 一、存储Bean对象 之前我们存储Bean时&#xff…

5 Redis缓存穿透、击穿、雪崩、分布式锁、布隆过滤器

1 Redis 应用问题解决 1.1 缓存穿透 1.1.1 问题描述 key 对应的数据在数据源并不存在,每次针对此 key 的请求从缓存获取不到,请求都会压到数据源(数据库),从而可能压垮数据源。比如 用一个不存在的用户 id 获取用户…

一份标准的软件测试方案模板

第一章 概述 ​ 软件的错误是不可避免的,所以必须经过严格的测试。通过对本软件的测试,尽可能的发现软件中的错误,借以减少系统内部各模块的逻辑,功能上的缺陷和错误,保证每个单元能正确地实现其预期的功能。检测和排…

亚马逊云科技开启您的云财务管理之旅:云财务运营

亚马逊云科技“开启您的云财务管理之旅”系列内容提出了关于如何启动和实施一个成功的云财务管理CFM战略的建议。云财务管理CFM的三个原则:SEE-查看、SAVE-节省和PLAN-计划。接下来介绍的是第四个阶段:RUN-运营。 在这一阶段,可以了解云财务管…