1、什么是redux?
一个组件里可能会有很多的状态,比如控制某个内容显示的flag,从后端获取的展示数据,那么这些状态可以在自己的单个页面进行管理,也可以选择别的管理方式,redux就是是一种状态管理的方式。

2、为什么要用redux?
(1) 数据共享,当我们的很多页面都要用到同一数据时,就可以把数据放到redux中,达到状态共享的目的。
(2) 合并管理状态,业务当中可能会有很多的状态需要维护,且各个状态之间可能还有相互依赖的关系,不统一管理的话很难追踪状态的变化。

3、redux的基础概念
(1) store
store是一个仓库,用来存储数据,它可以获取数据,也可以派发数据,还能监听到数据的变化。

(2) action
action理解为动作,action的值一般为一个对象,格式如 { type: "", data: "" },type是必须要的,因为reducer处理数据的时候要根据不同的type来进行不同的操作。

(3) reducer
reducer是初始化以及处理派发的action的纯函数。

4、如何使用redux?
首先安装redux的依赖,npm i redux -D
(1) 定义action

export const countAction = (num) => ({ type: "ADD_NUMBER",data: num })

(2) 定义处理的action的reducer

export function counterReducer(prevState = 0, action){
switch(action.type){
case 'ADD_NUMBER':
return prevState + num;
default
return prevState;
}
}

(3) 创建store

import { createStore } from 'redux'
import { counterReducer } from './counterReducer'
export const store = createStore(counterReducer)

到这里,store就创建完成了,在组件里可以直接引入store和action,进行派发action的操作,此时有一个Home的组件,我们要在这里更改state中的数据。

import { store } from './store'
import { countAction } from './countAction'
store.dispatch(countAction(5))
store.getState() // 5

5、redux的三大核心

(1) 单一数据源
当我们有多个数据需要放到redux中管理时,是放在一个对象里,这个对象放在store中管理,虽然redux并没有强制只能创建一个store,但是多个数据源的话不那么容易管理,单一的数据源可以更好的追踪状态的变化。

(2) state是只读的
想要改变state,无法在组件上直接手动修改state的值,这样可以保证状态不会被随意改变,唯一的方式就是派发action,而是通过集中管理的形式去改变state。

(3) reducer是纯函数
纯函数指的是有相同的输入必定有相同的输出,在这种情况下,不可以修改入参,也不能发送网络请求,也不能进行获取随机数这样的操作,通过reducer将上一个state的状态和当前派发的action连接起来,返回一个新的状态。

6、redux如何进行异步操作?
redux中派发的action默认是只能进行同步的操作的,action被规定为一个对象,那如果想要在redux中进行异步操作,比如发送网络请求该怎么做?

这个时候需要用到中间件,常用的中间件有redux-thunk和redux-saga,需要安装依赖 npm i redux-thunk -D/ npm i redux-sage -D

redux-thunk允许派发的action为一个函数,可以在这个函数中进行异步请求,请求执行完成之后再派发一个同步的action,用于修改store中的数据。

redux-saga派发的action仍然为一个对象,但是saga在外侧拦截action,使用生成器函数来监听action,当派发的action中的type为监听的type时,再进行网络请求的发送,以及改变store中的数据。

这里演示一下redux-thunk,在定义store时,需要将中间件传入

import { createStore, applyMiddleware } from 'redux'
import { counterReducer } from './counterReducer'
import thunk from 'redux-thunk'
export const store = createStore(counterReducer,applyMiddleware(thunk))

action就可以写成函数的形式了

import { countAction } from './countAction'
export const getInfo = (data) => {
return (dispatch) => {
// 执行异步操作,异步操作执行完成后,再派发一个同步的action
// 这里用fetch做一个演示,发送网络请求后,更改之前的count的值
fetch('/')
.then(xhr=>xhr.text())
.then(result=>dispatch(countAction(10)))
}
}

7、拆分reducer

当reducer需要处理的逻辑比较多时,一个reducer需要进行非常多的switch case的判断,其中有获取异步请求数据的、有全局保存的状态,这时候逻辑就会比较杂乱,此时可以将reducer拆分,然后再进行合并。

假设此时有两个reducer,分别为 countReducer、userInfoReducer,分别的状态保存在store的countInfo和userInfo,此时可以使用 combineReducer 这个方法来合并

import countReducer from './countReducer '
import userInfoReducer from './userInfoReducer'
import { combineReducers } from 'redux'
const reducer = combineReducers({
countInfo: countReducer,
userInfo: userInfoReducer
})
export default reducer

此时返回的reducer仍然是一个纯函数,combineReducer这个函数就是依次执行传入的reducers,如果store里储存的值发生了变化,就返回新的state,如果没有变化,就返回原来的state。

redux的三个概念与三大核心的更多相关文章

  1. 通过三张图了解Redux中的重要概念

    上周利用业余的时间看了看Redux,刚开始有点不适应,一下在有了Action.Reducer.Store和Middleware这么多新的概念. 经过一些了解之后,发现Redux的单向数据里的模式还是比 ...

  2. docker——三大核心概念

    镜像.容器.仓库是docker的三大核心概念. docker镜像类似于虚拟机镜像,你可以将其理解为一个只读模板. docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用.容器是从 ...

  3. spring三大核心学习(一)---控制反转

    记得当年大学时候,java的企业级框架还是ssh的天下(spring,struts和hibernate),但是现在,感觉spring已经完全把那两个框架甩在后边了.用spring的人越来越多,用str ...

  4. Redux中的重要概念

    Action/Reducer/Store 首先,先看看第一张图,图中展示了Redux的单向数据流,以及Action.Reducer和Store这三个核心概念. 下面就围绕上图,非别介绍Action.R ...

  5. "阿拉伯""伊斯兰""穆斯林"三个概念怎么分?

    伊斯兰.阿拉伯.穆斯林这三个概念到底有什么不同?要言君将用五分钟给您概述这三个概念,并厘清其边界,说明其交集,帮您迅速构建"阿拉伯.伊斯兰.穆斯林"知识结构概图.相信您得沉思一下费 ...

  6. PPT鼠绘必须掌握的PPT绘图三大核心功能

    在PPT制作教程栏目中,陆陆续续的分享了一系列通过合并形状功能来绘图的教程,绘制安卓机器人.绘制西瓜.绘制鸡蛋.其实,合并形状功能只是PPT绘图的一部分,而真正想要掌握PPT鼠绘,仅仅是会使用合并形状 ...

  7. css基本概念与css核心语法介绍

    css基本概念 css是什么?不需要了解太多文字类介绍,记住css是层叠样式表,HTML是页面结构,css负责页面样式,javascrt负责静态页面的交互.CSS 能够对网页中元素位置的排版进行像素级 ...

  8. 【Mycat】Mycat核心开发者带你看尽Mycat三大核心配置文件

    写在前面 在分布式数据库中间件领域,Mycat和ShardingSphere可以说是在开源界有着相当重要的位置,不少小伙伴也在问我:Mycat和sharding-jdbc哪个好呀!其实,就我本身而言, ...

  9. 浅谈学习C++时用到的【封装继承多态】三个概念

    封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

  10. Java编码浅析(注意区分三个概念)(转)

    编码: (1)外部资源的字符集-----没有读入jvm中的数据都是外部资源 (2)jvm中数据的字符集-----都是unicode (1)和(2)之间发生交互时,如果不指定编码,则使用JVM平台默认字 ...

随机推荐

  1. Kubernetes Gateway API 深入解读和落地指南

    背景 Kubernetes Gateway API 是 Kubernetes 1.18 版本引入的一种新的 API 规范,是 Kubernetes 官方正在开发的新的 API,Ingress 是 Ku ...

  2. 通过Serverless私有化部署ChatGPT Web

    作为开发人员,想要自己部署一个渠道访问或是想随时访问但是奈何魔法有限,又或是海外服务器太贵,不想耗费这个钱,本文借助 Serverless 来搭建一下私有 ChatGPT 服务,Serverless ...

  3. 2023-04-09:使用 Golang 重写的 ffmpeg 示例encode_video.c,实现视频编码并将编码后的数据封装为容器格式,最终写入输出文件。

    2023-04-09:使用 Golang 重写的 ffmpeg 示例encode_video.c,实现视频编码并将编码后的数据封装为容器格式,最终写入输出文件. 答案2023-04-09: 本文介绍的 ...

  4. 2022-12-10:给你一个由小写字母组成的字符串 s ,和一个整数 k 如果满足下述条件,则可以将字符串 t 视作是 理想字符串 : t 是字符串 s 的一个子序列。 t 中每两个 相邻 字母在字

    2022-12-10:给你一个由小写字母组成的字符串 s ,和一个整数 k 如果满足下述条件,则可以将字符串 t 视作是 理想字符串 : t 是字符串 s 的一个子序列. t 中每两个 相邻 字母在字 ...

  5. 局部添加加载中效果loading (vue+elementUI)

    产品需求:有时候我们不想为整个页面添加loading效果.只想给局部区域添加loading效果.(这效果就不揍产品了) 在一个表格数据加载时,因为需要连接其它东西,所以后台接口返回数据需要较长时间,因 ...

  6. 数据分析缺失值处理(Missing Values)——删除法、填充法、插值法

    缺失值指数据集中某些变量的值有缺少的情况,缺失值也被称为NA(not available)值.在pandas里使用浮点值NaN(Not a Number)表示浮点数和非浮点数中的缺失值,用NaT表示时 ...

  7. 近期SQL优化实战分享

    分享一下本周SQL优化的两个场景. 如果能对读者有一定的启发,共同探讨,不胜荣幸. 版本信息:mysql,5.7.19 引擎: innodb 场景1 我们有一张常口表,里面的数据由各种数据源合并而来, ...

  8. 实例讲解Spring boot动态切换数据源

    摘要:本文模拟一下在主库查询订单信息查询不到的时候,切换数据源去历史库里面查询. 本文分享自华为云社区<springboot动态切换数据源>,作者:小陈没烦恼 . 前言 在公司的系统里,由 ...

  9. 代码随想录算法训练营Day27 回溯算法|39. 组合总和 40.组合总和II 131.分割回文串

    代码随想录算法训练营 39. 组合总和 题目链接:39. 组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ta ...

  10. git上传对象文件错误解决方案

    git上传对象文件错误解决方案 ​ 时隔一个星期, 当我再次完成开发之后, 准备将代码上传, 却出现了一个上传代码的错误, 记录一下错误和解决方案 解决方案: 运行git fsck --full (b ...