【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.listconst 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可以有效的组织订阅者发生刷新;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IPv6自动隧道---6to4隧道

IPv6 over IPv4自动隧道特点 由于IPv4兼容IPv6隧道要求每一个主机都要有一个合法的IP地址,而且通讯的主机要支持双栈、支持IPv4兼容IPv6隧道,不适合大面积部署。目前该技术已经被6to4隧道所代替。 6to4隧道 集手动隧道和自动隧道的优点于一身,提出6to4的目的是为IPv4网络…

目标检测开源数据集——道路坑洼

一、危害 对车辆的影响:道路坑洼会导致车辆行驶不稳,增加车辆的颠簸,不仅影响乘坐舒适度,还可能对车辆的悬挂系统、轮胎等造成损害。长期在坑洼路面上行驶,车辆的减震系统、悬挂系统等关键部件容易受损,进…

【计算机组成与体系结构Ⅱ】多Cache一致性的模拟分析(实验)

实验八:多Cache一致性的模拟分析 一、实验目的 1:加深对多 Cache 一致性的理解。 2:进一步掌握解决多 Cache一致性的目录协议和监听协议的基本思想。 3:掌握在各种情况下, 目录协议和监听协议是如何工作的&#xf…

Jupyter Notebook

2017年左右在大学里都听说过Jupyter Notebook,并且也安装用了一段时间,后来不知道什么原因没有用了。估计是那时候写代码的时候多一些,因为它可以直接写代码并运行结果,现在不怎么写代码了。 介绍 后缀名为.ipynb的json格式文件…

雍禾植发为地球种下发际线,雍禾医疗以公益名义为消费者种下希望

“绿水青山才是金山银山”,绿色现已成为新时代中国的鲜明底色。天更蓝,水更清,人与环境和谐发展已深入人心。位于内蒙古自治区阿拉善盟西部的额济纳旗常年干旱少雨,风沙肆虐,这里亟需被植上一片森林,为地球…

Grind75第9天 | 733.图像渲染、542.01矩阵、1235.规划兼职工作

733.图像渲染 题目链接:https://leetcode.com/problems/flood-fill 解法: 可以用深度优先搜索和广度优先搜索。 深度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格的染色,然后继续对…

AI嵌入式K210项目(11)-SPI Flash读写

文章目录 前言一、K210的SPI二、Flash介绍三、实验过程总结 前言 这一章我们来学习下SPI及其应用,SPI 是一种高速的,全双工,同步的通信总线,由于其高速、同步和简单的特性,被广泛应用于各种微控制器和外围设备之间的通…

统计学R语言实验7 方差分析

统计学R语言实验7 方差分析 一、实验目的 1. 掌握理解方差分析的相关概念。 2. 掌握理解方差分析的相关方法。 3. 熟悉R语言等语言的集成开发环境。 二、实验分析与内容 完成教材P117的第4题 本题采用单因素方差分析来解题: (1)分析三…

2023年全球软件架构师峰会(ArchSummit深圳站):核心内容与学习收获(附大会核心PPT下载)

本次峰会是一次重要的技术盛会,旨在为全球软件架构师提供一个交流和学习的平台。本次峰会聚焦于软件架构的最新趋势、最佳实践和技术创新,吸引了来自世界各地的软件架构师、技术专家和企业领袖。 在峰会中,与会者可以了解到数字化、AIGC、To…

电梯节能落座-智慧停车场️,电梯不仅可载人也可以载汽车!

电梯不仅可载人也可以载汽车哦! 在北京市丰台区,有这么一个智慧停车场🅿️ ,共298个停车位,全部智能一体化,简直是“豪华” “智能” 的象征。 523能源:小伍,你跑题了... 小伍&am…

【牛客周赛Round 27】题目讲解

题目一 小红的二进制删数字: 小红拿到了一个二进制字符串 s,她可以删掉其中的一些字符,使得最终该字符串为一个2的幂(即可以表示为 2^k 形式的数)。小红想知道,自己最少删几个字符可以达成?请你…

【GAMES101】Lecture 07 着色(shading)

目录 着色 Blinn-Phong反射模型 漫反射 光衰减 着色 这个着色(shading)就是将不同的材质应用到不同的物体上,像一个物体,它可以是木头的、金属的、塑料的…… Blinn-Phong反射模型 我们来看一个简单的着色模型,…