首页 > 其他分享 >redux的三个概念与三大核心

redux的三个概念与三大核心

时间:2023-09-12 10:36:48浏览次数:47  
标签:核心 reducer 三大 派发 action import redux store

redux的三个概念与三大核心

 

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。

标签:核心,reducer,三大,派发,action,import,redux,store
From: https://www.cnblogs.com/sexintercourse/p/17695345.html

相关文章

  • Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
    是@SpringBootApplication由三个注解组成@EnableAutoConfiguration:开启自动配置@SpringBootConfiguration:和@Configuration作用类似,表明自己是一个配置类,不同的是@SpringBootConfiguration允许自动配置@ComponetScan:设置扫描路径......
  • 求数组中第三大的数
    //1.从数组中找出第三大的数,例如{10,10,9,9,8,8,7,7}第三大的数是8publicclassThirdLargestNumber{publicstaticvoidmain(String[]args){int[]nums={10,10,9,9,8,8,7,7};intthirdLargest=findThirdLargest(nums);System.......
  • 简单介绍 Spring MVC 的核心组件
    DispatcherServlet和九大组件(按使用顺序排序的):组件说明DispatcherServletSpringMVC的核心组件,是请求的入口,负责协调各个组件工作MultipartResolver内容类型(Content-Type)为multipart/*的请求的解析器,例如解析处理文件上传的请求,便于获取参数信息以及上传的......
  • 京熹生活APP系统功能和核心源码分享
    卷轴模式的定义介绍?新用户注册,先送用户一部分购物积分,该积分用于兑换一个初始任务,俗称卷轴任务,卷轴模式的基本的原理是,会员用积分兑换卷轴卷轴,完成卷轴任务之后,你可以获得更多的购物积分。同时会员可以用积分参与更高级的卷轴任务,同样,当完成这些任务后,用户可以获得更多的积分。 京熹......
  • 性能测试的核心3步骤
    步骤一:梳理性能需求优先做需求的分析,熟悉业务流程从产品经理或其他负责人中获取性能需求:测试的范围及目标梳理出性能测试的具体场景及性能指标要求设计出性能测试用例步骤二:执行性能测试搭建性能测试环境使用合适的工具实际执行性能测试用例将性能测试的结果统一采集,可......
  • 机器学习算法原理实现——神经网络反向传播,链式求导核心
    记得先看之前的梯度下降文章!   链式求导的核心来了,就高中数学知识: 代码实现:importnumpyasnpimportmatplotlib.pyplotasplt#Sigmoid激活函数及其导数defsigmoid(z):return1/(1+np.exp(-z))defsigmoid_derivative(z):returnsigmoid(......
  • #yyds干货盘点# LeetCode程序员面试金典:第三大的数
    1.简述:给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。 示例1:输入:[3,2,1]输出:1解释:第三大的数是1。示例2:输入:[1,2]输出:2解释:第三大的数不存在,所以返回最大的数2。示例3:输入:[2,2,3,1]输出:1解释:注意,要求返回第三大的数,是指在所......
  • Maven--Maven的核心概念
    一、maven核心概念  1、Maven工程约定目录结构  2、pom文件  3、仓库  4、Maven的生命周期  5、Maven的常用命令  6、插件  7、坐标(gav)  8、依赖(dependency)二、maven约定的目录结构三、maven项目创建及其下载的东西1、使用命令编译maven项目 ......
  • mybatis核心配置文件以及mapper文件的配置
    config文件<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>......
  • drf- 三大认证、排序
    三大认证组件登录认证我们可以使用auth自带的User表,也可以选择自定义表.写登录接口,登录成功要有标志,生成一个随机的字符串,放到表中,以后只要携带这个字符串就可以登录成功。视图层方法一:classUserView(GenericViewSet):queryset=models.UserInfo.objects.all()......