redux详细介绍

2023-11-04

redux详细介绍

1、redux

1、redux是什么?

redux是一个专门做状态管理的js库(不是react插件库)

它可以用在react,angular,vue等项目中,但基本与react配合使用

作用:集中式管理react应用中多个组件共享状态

2、什么情况下使用redux

某个组件的状态,需要让其他组件可以随时拿到(共享)

一个组件需要改变另一个组件的状态(通信)

总体原则:能不用就不用,如果不用比较吃力才考虑使用

3、redux工作流程

二、redux的三个核心概念

1、ation

(1)动作的对象

(2)包括2个属性:

type:标识属性,值为字符串,唯一,必要属性

data:数据属性,值类型任意,可选属性

(3)例子:

{type:'ADD_STUDENT',data:{name:'tom',age:18}}

2、reducer

用于初始化状态、加工状态

加工时,根据旧的state和action,产生新的state的纯函数

3、store

(1)将state/action/reducer联系在一起的对象;

(2)如何得到此对象:

import {createStore} from 'redux';
import reducer from './reducers'
const store = createStore(reducer)

(3)此对象的功能?

getState():得到state;

dispatch(action):分发action,触发reducer调用,产生新的state;

subscribe(listener):注册监听,当产生了新的state时,自动调用的展示,要靠我们自己写。

三、案例

1、store.js文件

//该文件专门用于暴露一个store对象,整个应用只有一个store对象

//引入createStore,,专门用于创建redux中最核心的store对象
import {createStore, applyMiddleware} from 'redux';
//引入为Count组件服务的reducer
import countReducer from './count_reducer'
//引入redux-thunk,用于支持异步action
import thunk from 'redux-thunk'
const store = createStore(countReducer, applyMiddleware(thunk))
//暴露store
export default store

2、count_reducer.js

/*
1、该文件是用于创建一个Count组件服务的reducer,reducer的本质就是一个函数
2、reducer函数会接到两个参数,分别为:之前的状态(preState),动作对象(action)
3、reducer被第一次调用时,是store自动触发的,传递的preState是undefined,传递的action是类似于:{
 type: '@@REDUX/INIT_a.2.b.4'
}
*/
const {INCREMENT, DECREMENT} from './constant'
const initState = 0;//初始化状态,推荐写法

export default function countReducer (preState = initState, action) {
//if(preState === undefined) preState = 0
//从action对象中获取:type、data
 const { type, data} = action
 //根据type决定如何加工数据
 switch (type) {
  case INCREMENT://如果是加
    return preState + data;
   case DECREMENT://如果是减
    return preState - data;
   default: 
    return preState
 }
}

3、count_action.js

/*
 该文件专门为Count组件生成action对象
*/

function createIncrementAction(data) {
 return {
  type:'increment',
  data
 }
}

function createDecrementAction(data) {
 return {
  type:'decrement',
  data
 }
}

//改造之后
const {INCREMENT, DECREMENT} from './constant'

//同步action,就是指action的值为Object类型的一般对象
export const createIncrementAction = data => ({type:INCREMENT,data})
export const createDecrementAction = data => ({type:DECREMENT,data})

//异步action,就是指action的值为函数,异步action中一般都会调用同步action,异步action不是必须要用的。
export const createIncrementAsyncAction = (data, time) => {
 return (dispatch) => {
  setTimeout(() => {
   //函数体
   dispatch(createDecrementAction(data));
  },time)
 }
}

4、constant.js

/*
 该模块是用于定义action对象中type类型的常量值,目的只有一个:便于管理的同时防止在书写单词的时候,出现错误
*/

export const INCREMENT = 'increment'
export const DECREMENT = 'decrement';

5、在使用的文件中引入

//引入store,用于获取redux中保存的状态
import store from '../../redux/store'
//引入actionCreator专门用于创建action对象
import {createIncrementAction,createDecrementAction,createIncrementAsyncAction} from '../../redux/count_action'

//componentDidMount() {
 //监测redux中状态的变化,只要变化,就调用render
 //store.subscribe(() => {
   //this.setState({})
 //})
//}

//加法
increment = () => {
 const { value } = this.selectNumber;
 //store.dispatch({type:'increment', date : value * 1});
 store.dispatch(createIncrementAction(value * 1));
}
//减法
decrement = () => {
 const { value } = this.selectNumber;
 //store.dispatch({type:'decrement', date : value * 1});
 store.dispatch(createDecrementAction(value * 1));
}

//奇数再加
incrementIfOdd = () => {
  const { value } = this.selectNumber;
  const count = store.getState();
  if (count % 2 !== 0) {
   //store.dispatch({type:'increment',data : value * 1})
   store.dispatch(createIncrementAction(value * 1));
  }
}
incrementAsync = () => {
 const { value } = this.selectNumber;
 store.dispatch(createIncrementAsyncAction(value * 1 , 500))
}

render() {
 return (
   <div>
     <h1>当前和为: {store.getState()}</h1>
   </div>
 )
}

监测redux中状态的改变,如redux的状态发生了变化,那么重新渲染App组件

import React from "react";
import ReactDOM from "react-dom";
import App from './App';
import store from './store/store';
ReactDOM.render(<App/>,document.getElementById('root'))
// 在这里需要明确的是:redux只是一个状态的管理机制,它不会自动的触发页面的更新,需要我们自己去写
store.subscribe(() => ReactDOM.render(<App/>,document.getElementById('root')))

备注:redux只负责管理状态,至于状态的改变驱动着页面,需要自己去写

四、action

两种类型:Object和function

Object:同步action
function:异步action
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redux详细介绍 的相关文章

随机推荐

  • leecode 题目5 最长回文子串(python)

    给你一个字符串 s 找到 s 中最长的回文子串 示例 1 输入 s babad 输出 bab 解释 aba 同样是符合题意的答案 示例 2 输入 s cbbd 输出 bb 代码是根据B站上的一位up主写的 使用动态规划算法 从小字符串衍生相
  • css3新弹性盒子-flex-grow

    目录 flex grow 1 flex grow定义和用法 2 flex grow属性值 flex grow说明 flex grow实例 flex grow flex grow属性在CSS新弹性盒模型中是比较常用 想要用好它就先了解它的 语
  • 花卉识别卷积神经网络

    卷积神经网络做的花卉识别 keras 五分类 向日葵 雏菊 郁金香 玫瑰 蒲公英 之后更怎么做的
  • 【专题5: 硬件设计】 之 【68.开关电源 之 buck电路中的电感电流波形】

    嵌入式工程师成长之路 系列文章 总目录 系列文章总目录 希望本是无所谓有 无所谓无的 这正如脚下的路 其实地上本没有路 走的人多了 也便成了路 原创不易 文章会持续更新 欢迎微信扫码关注公众号 承接 小程序 嵌入式 PC端项目开发 联系作者
  • Arduino基础入门篇31—LCD1602液晶显示

    LCD1602也叫1602字符型液晶 是一种专门用来显示字母 数字 符号的点阵型液晶模块 能同时显示16X2即32个字符 本篇我们来认识LCD1602 驱动它显示 Hello World 1 LCD1602介绍 对于单片机爱好者和电子爱好者
  • php-cgi.exe - FastCGI 进程超过了配置的请求超时时限

    解决方案一 处理 php cgi exe FastCGI 进程超过了配置的请求超时时限 的问题 内容转载 处理 php cgi exe FastCGI 进程超过了配置的请求超时时限 的问题 php技巧 脚本之家 详细错误 HTTP 错误 5
  • 【华为OD机试真题 JAVA】出错的或电路

    JS版 华为OD机试真题 JS 出错的或电路 标题 出错的或电路 时间限制 1秒 内存限制 262144K 语言限制 不限 某生产门电路的厂商发现某一批次的或门电路不稳定 具体现象为计算两个二进制数的或操作时 第一个二进制数中某两个比特位会
  • 利用Java对后端数据进行分页处理(Java假分页)

    代码如下 import java util Collections import java util List java分页 辅助器 public class PageHelper
  • HttpClient远程调用工具类

    文章目录 前言 一 HttpClient工具类 二 使用步骤 1 引入库 前言 提示 当前工具类get方式无法传分页数据 可自行篡改 不行就用post方式哈哈 提示 以下是本篇文章正文内容 下面案例可供参考 一 HttpClient工具类
  • Qt中显示摄像头数据(V4L2三)

    目录 一 通过V4l2来采集用qt显示 1 将V4L2获取摄像头数据封装成一个类 2 设置开始按钮开始采集数据 3 设置停止按钮停止采集数据 4 设置定时器不断采集数据 二 直接用qt多媒体模块来实现采集并且显示 1 在qt工程文件中添加
  • 【网络结构设计】7、RepVGG

    文章目录 一 背景 二 方法 2 1 使用简单结构的卷积神经网络的三个原因 2 2 使用多分支结构的训练时长 2 3 边端设备推理的重参数化 2 4 结构细节 三 效果 论文 RepVGG Making VGG style ConvNets
  • 解决野鸡大学水硕、水博?中国首次发布海外大学排名!

    本文分享中国首次发布的海外大学排名 来源 全国高校信息资料研究会与中国人民大学评价研究中心 新东方在线托福 青塔等平台 编辑 学妹 不久前 我国一科研机构首次发布了对海外学校的评估 网传 这或许会成为以后中国看待海归大学的背景考核依据之一
  • 深度学习:循环神经网络RNN及LSTM

    深度学习 循环神经网络RNN及LSTM 循环神经网络RNN 原理 代码 长短期记忆网络LSTM 原理 遗忘门 记忆门 输出门 代码 循环神经网络RNN 原理 对于传统的神经网络 它的信号流从输入层到输出层依次流过 同一层级的神经元之间 信号
  • 两行css代码实现瀑布流,html,css最简单的瀑布流实现方式且没有缺点!

    两行css代码实现瀑布流 html css最简单的瀑布流实现方式且没有缺点 之前一直使用css position定位 js原生的方法实现 代码如下 html代码段
  • 因果推断理论框架 Potenial Outcomes Framework

    1 Potenial Outcomes Framework 因果效应通常无法直接计算 无法同时观测一个样本施加和不施加干预的结果 所以通常是通过观测数据推断 由于相关性 neq 因果性 观测结果不直接等于ATE Potenial Outco
  • SpringBoot 基本使用

    目录 热部署 方式一 Spring Boot DevTools 方式二 使用JRebel插件 web静态资源的存放 json日期时间设置 组件扫描 资源导入 运行项目的多个实例 资源文件的拷贝问题 读取resources下的文件 SpEL的
  • python三本经典书籍-关于 Python 的经典入门书籍有哪些?

    先说明 这些书是我整理来准备以后慢慢看的 并没有全部购买 更没有全部阅读 排名不分先后 Learn Python the Hard Way 本书是一本Python入门书籍 适合对计算机了解不多 没有学过编程 但对编程感兴趣的读者学习使用 这
  • GPU版本PyTorch详细安装教程

    目录 一 安装显卡驱动 1 查看显卡驱动型号 2 下载显卡驱动 3 查看GPU状态 二 安装Visual Studio 2019 三 安装CUDA 1 下载对应版本的CUDA 2 安装下载好的CUDA 3 设置环境变量 四 安装cudnn
  • ImportError: cannot import name ‘Bar‘ from ‘pyecharts‘ (D:\Anaconda3-2019.03\Anaconda3\lib\site-pack

    如题所示错误 无法从pyecharts中导入Bar 这里我安装的是最新版的pyecharts 新版Bar的导入方式有所改变 之前的导入方式 from pyecharts import Bar 已经不适用在新版本中了 现在的导入方式为 fro
  • redux详细介绍

    redux详细介绍 1 redux 1 redux是什么 redux是一个专门做状态管理的js库 不是react插件库 它可以用在react angular vue等项目中 但基本与react配合使用 作用 集中式管理react应用中多个组