【React】Redux的使用详解

文章目录

    • Redux的三大原则
    • Redux官方图
    • react-redux使用
      •  1、创建store管理全局状态
      • ​ 2、在项目index.js根节点引用
      •  3、 在需要使用redux的页面或者组件中,通过connect高阶组件映射到该组件的props中
    • redux中异步操作
    • 如何使用redux-thunk
    • combineReducers函数

Redux的三大原则

单一数据源

​  整个应用程序的state被存储在一颗object tree中,并且这个object tree只存储在一个 store 中:

​  Redux并没有强制让我们不能创建多个Store,但是那样做并不利于数据的维护;

​  单一的数据源可以让整个应用程序的state变得方便维护、追踪、修改;

State是只读的

​  唯一修改State的方法一定是触发action,不要试图在其他地方通过任何的方式来修改State:

​  这样就确保了View或网络请求都不能直接修改state,它们只能通过action来描述自己想要如何修改state;

​  这样可以保证所有的修改都被集中化处理,并且按照严格的顺序来执行,所以不需要担心race condition(竟态)的问题;

使用纯函数来执行修改

​  通过reducer将 旧state和 actions联系在一起,并且返回一个新的State:

​  随着应用程序的复杂度增加,我们可以将reducer拆分成多个小的reducers,分别操作不同state tree的一部分;

​  但是所有的reducer都应该是纯函数,不能产生任何的副作用;

Redux官方图

在这里插入图片描述

react-redux使用

◼ 安装react-redux:

yarn add react-redux

 1、创建store管理全局状态

-src

—store

------- constants.js
先创建要使用的type常量

export const ADD_NUMBER = "add_number"
export const SUB_NUMBER = "sub_number"

export const CHANGE_BANNERS = "change_banners"
export const CHANGE_RECOMMENDS = "change_recommends"

-src

—store

------- reducer.js

再创建reducer管理状态

import * as actionTypes from "./constants"

const initialState = {
  counter: 100,
  
  banners: [],
  recommends: []
}

function reducer(state = initialState, action) {
  switch (action.type) {
    case actionTypes.ADD_NUMBER:
      return { ...state, counter: state.counter + action.num }
    case actionTypes.SUB_NUMBER:
      return { ...state, counter: state.counter - action.num }
    case actionTypes.CHANGE_BANNERS:
      return { ...state, banners: action.banners }
    case actionTypes.CHANGE_RECOMMENDS:
      return { ...state, recommends: action.recommends }
    default:
      return state
  }
}

export default reducer


-src

—store

------- index.js
在index导出整个store

import { createStore } from "redux"
import reducer from "./reducer"


const store = createStore(reducer)

export default store

-src

—store

------- actionCreators.js
创建actionCreators,放修改状态的函数

import * as actionTypes from "./constants"
import axios from "axios"

export const addNumberAction = (num) => ({
  type: actionTypes.ADD_NUMBER,
  num
})

export const subNumberAction = (num) => ({
  type: actionTypes.SUB_NUMBER,
  num
})


export const changeBannersAction = (banners) => ({
  type: actionTypes.CHANGE_BANNERS,
  banners
})

export const changeRecommendsAction = (recommends) => ({
  type: actionTypes.CHANGE_RECOMMENDS,
  recommends
})



export const fetchHomeMultidataAction = () => {
  // 如果是一个普通的action, 那么我们这里需要返回action对象
  // 问题: 对象中是不能直接拿到从服务器请求的异步数据的
  // return {}

  return function(dispatch, getState) {
    // 异步操作: 网络请求
    // console.log("foo function execution-----", getState().counter)
    axios.get("http://123.207.32.32:8000/home/multidata").then(res => {
      const banners = res.data.data.banner.list
      const recommends = res.data.data.recommend.list

      // dispatch({ type: actionTypes.CHANGE_BANNERS, banners })
      // dispatch({ type: actionTypes.CHANGE_RECOMMENDS, recommends })
      dispatch(changeBannersAction(banners))
      dispatch(changeRecommendsAction(recommends))
    })
  }

  // 如果返回的是一个函数, 那么redux是不支持的
  // return foo
}


​ 2、在项目index.js根节点引用

-src

— index.js

在这里插入图片描述

 3、 在需要使用redux的页面或者组件中,通过connect高阶组件映射到该组件的props中

​ 解耦store和class组件的耦合

在这里插入图片描述

redux中异步操作

redux也引入了中间件(Middleware)的概念:

​  这个中间件的目的是在dispatch的action和最终达到的reducer之间,扩展一些自己的代码;

​  比如日志记录、调用异步接口、添加代码调试功能等等;

我们现在要做的事情就是发送异步的网络请求,所以我们可以添加对应的中间件:

​  这里官网推荐的、包括演示的网络请求的中间件是使用 redux-thunk

redux-thunk是如何做到让我们可以发送异步的请求呢?

​  我们知道,默认情况下的dispatch(action),action需要是一个JavaScript的对象;

​  redux-thunk可以让dispatch(action函数),action可以是一个函数;

​  该函数会被调用,并且会传给这个函数一个dispatch函数和getState函数;

​ ✓ dispatch函数用于我们之后再次派发action;

​ ✓ getState函数考虑到我们之后的一些操作需要依赖原来的状态,用于让我们可以获取之前的一些状态;

如何使用redux-thunk

1.安装redux-thunk

如何使用redux-thunk

yarn add redux-thunk

2.在创建store时传入应用了middleware的enhance函数

​  通过applyMiddleware来结合多个Middleware, 返回一个enhancer;

​  将enhancer作为第二个参数传入到createStore中;

// 通过applyMiddleware来结合多个Middleware, 返回一个enhancer
const enhancer = applyMiddleware(thunkMiddleware);
// 将enhancer作为第二个参数传入到createStore中
const store = createStore(reducer, enhancer);

3.定义返回一个函数的action:

​  注意:这里不是返回一个对象了,而是一个函数;

​  该函数在dispatch之后会被执行;

const getHomeMultidataAction = () => {
  return (dispatch) => {
    axios.get("http://123.207.32.32:8000/home/multidata").then(res => {
      const data = res.data.data;
      dispatch(changeBannersAction(data.banner.list));
      dispatch(changeRecommendsAction(data.recommend.list));
    })
  }
}

combineReducers函数

事实上,redux给我们提供了一个combineReducers函数可以方便的让我们对多个reducer进行合并:

那么combineReducers是如何实现的呢?

​  事实上,它也是将我们传入的reducers合并到一个对象中,最终返回一个combination的函数(相当于我们之前的reducer函

数了);

​  在执行combination函数的过程中,它会通过判断前后返回的数据是否相同来决定返回之前的state还是新的state;

​  新的state会触发订阅者发生对应的刷新,而旧的state可以有效的组织订阅者发生刷新;

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

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

相关文章

Pixels:重新定义游戏体验的区块链农场游戏

数据源:Pixels Dashboard 作者:lesleyfootprint.network 最近,Pixels 通过从 Polygon 转移到 Sky Mavis 旗下的 Ronin 网络,完成了一次战略性的转变。 Pixels 每日交易量 Pixels 在 Ronin 网络上的受欢迎程度急剧上升&#xf…

关于VScode的这个ssh的配置的经验

1.首先,我是因为重装了ubantu系统,不得不重新配置ssh 2.第一步,在本机的终端安装ssh插件: (1) (2)restart开启这个ssh端口 3.然后,就在vscode里面,安装哪个…

【办公自动化】利用Python代码暴力破解RAR压缩包的密码

title: 利用Python代码暴力破解RAR压缩包的密码 tags: bigleft excerpt: 利用Python代码暴力破解RAR压缩包的密码 利用Python代码暴力破解RAR压缩包的密码 引言 有时从网盘或p2p下载了几个G的资源,下载了几天,终于下载完成,结果发现来需要密…

QT上位机开发(MySql访问)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 网上介绍的关于QT和mysql部分的内容,都是利用Qt自带的mysql库来实现数据读写的。但是事实上来说,即使不用qt带的库&#xf…

12.30平衡二叉树、生成树最短路、链表、排序、二叉树——数算选择题专练

1 平衡二叉树 节点数目一定时,平衡因子为1时,树最高。 平衡二叉树,左右子树都是平衡的,最少要满足一个式子,即维护左右都是AVL,最多就是满二叉树,节点总数为2^(h-1);最少的时候,每…

2.mac 安装 Visual studio code 整合go开发

目录 概述前置下载关键命令整合C#go配置go插件常见的go工具安装测试 结束 概述 mac 安装 Visual studio code 整合go开发 相关前置文章 go安装及相关配置 文章 前置 官网速递 mac 系统高于等于 10.15.x 可以直接最新版本 我的系统是 10.13 ,所以只能安装此版本…

Linux系统三剑客之awk命令详解(三)

Linux系统三剑客之grep和正则表达式的介绍(一)-CSDN博客 Linux系统三剑客之sed命令详解(二)-CSDN博客 接上文 目录 1.作用 2.语法 3.变量 4.选项 5.模式 ​编辑 6.动作 7.实例 1.作用 awk是一个强大的文本分析工具,其主要工作原理就是将文件内容逐行读取…

手拉手Vue组件由浅入深

组件 (Component) 是 Vue.js 最强大的功能之一,它是html、css、js等的一个聚合体,封装性和隔离性非常强。 组件化开发: 1、将一个具备完整功能的项目的一部分分割多处使用 2、加快项目的进度 3、可以进行项目的复用 组件注册分…

IaC基础设施即代码:Terraform 连接 aws S3 实现多资源管理

目录 一、实验 1.环境 2.aws 亚马逊云创建用户 3.Windows使用Terraform 初始化 aws provider 4.Windows使用Terraform 创建S3存储资源 (对象存储) 5.Windows使用Terraform 创建Dynamo DB资源 (表格存储) 6.Windows给Terrafo…

Skywalking链路追踪

目录 一、简介1.1、APM系统1.2、SkyWalking 简介 二、快速入门2.1、下载、启动2.2、界面认识 三、持久化存储四、告警通知五、自定义追踪-细粒度追踪service方法 一、简介 1.1、APM系统 APM(Application Performance Monitoring)系统是一种用于监控和管…

《Redis:NoSQL演进之路与Redis深度实践解析》

文章目录 关于NoSQL为什么引入NoSQL1、单机MySQL单机年代的数据库瓶颈 2、Memcached(缓存) MySQL 垂直拆分 (读写分离)3、分库分表水平拆分MySQL集群4、如今的网络架构5、总结 NoSQL的定义NoSQL的分类 Redis入门Redis能干嘛&…

AI教我学编程之C#类的基本概念(1)

前言 在AI教我学编程之C#类型 中,我们学习了C#类型的的基础知识,而类正是类型的一种. 目录 区分类和类型 什么是类? 对话AI 追问 实操 追踪属性的使用 AI登场 逐步推进 提出疑问 药不能停 终于实现 探索事件的使用 异步/交互操作 耗时操…

IO网络4.0

思维导图 tftp上传 #include <myhead.h>#define ERR_LOG(msg) do{\perror(msg);\printf("%d %s %s\n", __LINE__, __func__, __FILE__);\ }while(0)#define PORT 69 #define N 516int do_upload(int sfd, struct sockaddr_in sin);int main(int a…

k8s的对外服务ingress

1、service的作用体现在两个方面 &#xff08;1&#xff09;集群内部&#xff1a;不断跟踪pod的变化&#xff0c;更新deployment中的pod对象&#xff0c;基于pod的ip地址不断变化的一种服务发现机制 &#xff08;2&#xff09;集群外部&#xff1a;类似于负载均衡器&#xff…

PuTTY的ppk密钥与OpenSSH密钥之间的相互转换

几个概念说明&#xff1a;id_rsa、id_rsa.pub、ppk、pem 目前有两个主流的密钥格式&#xff1a;OpenSSH格式的密钥 和 PuTTY格式的密钥。 id_rsa和id_rsa.pub 都是OpenSSH格式的密钥。 id_rsa是OpenSSH格式的SSH私钥。 id_rsa.pub是OpenSSH格式的SSH公钥。ppk文件 ppk文件是P…

机器视觉系统在汽车车轮毂检测上的应用

将机器视觉用于轮毂检测&#xff0c;可以利用图像分析的方法来测量轮毂特征尺寸、判断轮毂形状&#xff0c;并获取其位置坐标等信息&#xff0c;从而能够辨识流水生产线上的各种款式和型号的汽车轮毂。 市面上对汽车车轮毂具体检测要求如下 &#xff1a; 1.为了分辨流水线上…

HTTPS:如何确保您的网站数据传输安全?

目录 博客前言 一.HTTPS 1.1 HTTPS简介 1.2 HTTP和HTTPS区别 1.3 TLS/SSL协议工作原理 1.3.1 TLS/SSL协议结构 1.3.2 SSL/TLS握手协议建立连接过程 1.2.3 SSL/TLS报文分析 博客前言 以下是一个关于HTTPS协议的博客前言示例&#xff1a; 欢迎来到我的博客&#xff0c;今…

2024年腾讯云轻量服务器和CVM云服务器性能如何?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

【面试】测试/测开(ING3)

190. 栈和堆在内存管理上的区别 栈 1&#xff09; 栈是由系统自动分配和回收的内存。 2&#xff09;栈的存储地址是由高地址向低地址扩展的。 3&#xff09;栈是一个先进后出的结构。 4&#xff09;栈的空间大小是一个在编译时确定常数&#xff0c;即栈的大小是有限制的&#x…

2024年回炉计划之排序算法(一)

算法是计算机科学和信息技术中的重要领域&#xff0c;涉及到问题求解和数据处理的方法。要学习算法&#xff0c;你可能需要掌握以下一些基本知识&#xff1a; 基本数据结构&#xff1a; 了解和熟练使用各种数据结构&#xff0c;如数组、链表、栈、队列、树和图等。数据结构是算…