【React】React——redux

news2025/1/19 14:09:06

🚩🚩🚩
💎个人主页: 阿选不出来
💨💨💨
💎个人简介: 一名大二在校生,学习方向前端,不定时更新自己学习道路上的一些笔记.
💨💨💨
💎目前开发的专栏: JS 🍭Vue🍭React🍭
💨💨💨

React——redux

    • Redux理解
      • redux是什么
      • redux基本使用
    • Redux的三个核心概念
      • 1.action
      • 2.reducer
      • 3.store
    • react-redux
      • Provider
      • Connect

Redux理解

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。

redux是什么

  1. redux是一个专门用于做状态管理的JS库(不是react插件库)。
  2. 它可以用在react,angular,vue等项目中,但基本与react配合使用。
  3. 作用:集中式管理react应用中多个组件共享的状态。

redux的使用场景

  1. 某个组件的状态,需要让其他组件可以随时拿到(共享)。
  2. 一个组件需要改变另一个组件的状态(通信)。
  3. 总体原则:能不用就不用,如果不用比较吃力才考虑使用。

redux的三大原则

  • state以单一对象存储在store对象中
  • state只读(每次都返回一个新的对象)
  • 使用纯函数reducer执行state更新

redux基本使用

下载redux包

npm i redux

代码结构
在这里插入图片描述

store.js文件专门用于创建并配置store并暴露

//引入createstore,用于创建store对象
import {legacy_createStore as createStore} from 'redux'
// 引入reducer
import reducer from './reducers'

const store = createStore(reducer)

export default store

actions文件夹存放多个为指定组件生成的action对象。

reducers文件夹存放多个为指定组件服务的reducer纯函数。

constant.js文件用于定义action对象中type类型的常量值,便于管理,防止单词的拼写错误。

例:

export const INCREMENT = 'increment'

Redux的三个核心概念

Redux的工作流

  • View在redux中会派发action方法
  • action通过store的dispatch方法会派发给store
  • store接收action,连同之前的state,一起传递给reducer
  • reducer返回新的数据给store
  • store去改变自己的state

在这里插入图片描述

1.action

Action 是把数据从应用(译者注:这里之所以不叫 view 是因为这些数据有可能是服务器响应,用户输入或其它非 view 的数据 )传到 store 的有效载荷。它是 store 数据的唯一来源。一般来说你会通过 store.dispatch() 将 action 传到 store。

const ADD_TODO = 'ADD_TODO'
{
	type: ADD_TODO,
	data: 'Bilid my first Redux app'
}

action本质为JavaScript普通对象。

action内必须包含 type 属性,值为字符串,表示将要执行的动作,作为唯一标识。

type属性外,action对象的结构完全由你自己决定,通常会传入 data属性,值为某个组件向reducer函数操作state时传的参数。

在模块化开发中,一个组件可能会需要多个action对象,通常按照下方的写法。

const INCREMENT = 'INCREMENT'
export const increment = data =>({type: INCREMENT,data})
...

异步action

例如:点击一个按钮,三秒后让一个count数值加一。

当点击按钮后,组件内通过 store.dispatch 将action对象派发给store。

我们在action中返回一个定时器,3秒后调用同步action触发 dispatch执行加动作。

export const incrementAsync = (data,time) =>{
    return (dispatch)=>{
        setTimeOut(()=>{
            dispatch(increment(data))
        })
    }
}

由于redux本身不支持异步操作。react给我们提供了一个插件 redux-thunk 可以让redux拥有异步操作的能力。

用法:

store.js文件下

import {legacy_createStore as createStore,applyMiddleware} from 'redux'
import thunk from 'redux-thunk
...
export default createStore(reducer,applyMiddleware(thunk))

2.reducer

reducer用于将store发过来的action完成并将结果返回给store,他有两个作用:初始化store和更新store。

reducer接收两个参数preState(旧状态)和action(动作)并返回一个newState(新状态)。

(previousState, action) => newState

初始化状态

const initState = 0 //初始化状态

reducer纯函数

function count(preState=initState,action){
	// 从actions对象中获取:type,data
    const {type,data} = action
    //根据type决定如何加工数据
    switch(type){
        case INCREMENT:
            return xxx
        ...
        default:
        	return preState
    }
}

注意:redux的reducer是一个纯函数。纯函数是一类特别的函数。

纯函数的规则:

  • 不能改写参数数据。
  • 不会产生任何副作用,例如网络请求,输入和输出设备。
  • 不能调用Date.now()或Math.random()等不纯的方法。

例如:当我们要对store里的一个数组添加一个对象时:

错误的写法:

preState.unshift(data)

此时,preState这个实参被改写了,reducer不在是纯函数。

正确的写法:

使用对象展开运算符

[data,...preState] 创建了一个新数组。

combineReducers

Redux应用中只有一个单一的store。当多个组件都需要用到store时,便于数据逻辑处理,我们需要使用reducer组合。

redux提供了 combineReducers()工具类,组合多个reducer。

import {combineReducers} from 'redux'
//引入多个reducer
import reducer1 from './reducer1'
import reducer2 from './reducer2'
...
export default combineReducers({
	reducer1,
	reducer2
})

3.store

前文我们知道了使用action描述“发生了什么”,使用 reducers来根据action更新state的用法。

而 store 就是action 和 reducer 之间的桥梁。

store的创建

//引入createstore,用于创建store对象
import {legacy_createStore as createStore} from 'redux'
// 引入reducer
import reducer from './reducers'

const store = createStore(reducer)

createStore第一个参数传入reducer,第二个参数为可选的,用于设置state初始状态。

Store的职责

  • 维持应用的state;
  • 提供 getState()方法获取state;
  • dispatch(action) 更新state;
  • subscribe(listener)注册监听器;
  • subscribe(listener)返回的函数注销监听器;

这里需要再强调一下:Redux 和 React 之间没有关系。Redux 支持 React、Angular、Ember、jQuery 甚至纯 JavaScript。

为了让用户监听应用数据改变,Store 允许使用store.subscribe方法设置监听函数,一旦 State 发生变化,就自动执行这个函数。

在src/index.js入口文件中:

import store from './redux/store'
...
store.subscribe(()=>{
    root.render(<App/>)
})

react-redux

本库并不是 Redux 内置,需要单独安装,是Redux官方提供的React绑定库。

安装

npm i react-redux

redux将组件分为了UI组件容器组件两类:

  1. UI组件:不能使用任何redux的api,只负责页面的呈现、交互等。
  2. 容器组件:负责和redux通信,将结果(采用父子通信)传给UI组件。

Provider

<Provider store> 使组件层级中的 connect() 方法都能够获得 Redux store。

在src/index.jsx文件下:

...
root.render(
	<Provider store={store}
		<App/>
	</Provider>)

目的:让 <App> 所有的后代容器组件都能接收到store。

Connect

用于连接React组件与Redux store。

connect(mapStateToProps,mapDispatchToProps)
  • mapStateToProps(state, [ownProps]): stateProps] (Function)

    • 映射状态。
    • 该回调函数必须返回一个纯对象,这个对象会与组件的 props 合并。
    • 如果定义该参数,组件会监听redux store的变化,只要store发生改变,mapStateToProps就会被调用。
  • mapDispatchToProps(dispatch, [ownProps])

    • 映射操作状态的方法。

    • mapDispatchToProps可以是一个Function,也可以是Object,作用是绑定action创建函数到props上。

    • 如果传递的是一个对象,那么每个定义在该对象的函数都将被当作Redux action creator,而且这个对象会与 Reduxstore绑定在一起,其中所定义的方法名将作为属性名,合并到组件的 props 中;

    • 如果传递的是一个函数,该函数将接收一个 dispatch 函数,然后由你来决定如何返回一个对象,这个对象通过 dispatch 函数与action creator 以某种方式绑定在一起。

例:

头部的引入:

import React, { Component } from 'react'
import {connect} from 'react-redux'
import {
    increment,
    decrement,
    } from '../../redux/actions/count'

mapDispatchToProps返回值为函数时:

connect(
	state=>(count:state.count),
	dispatch=>({
		increment:number=> dispatch(increment(number))decrement:number=> dispatch(decrement(number))
	})
)

mapDispatchToProps返回值为对象时:

采用了对象的简写形式

connect(
	state=>(count:state.count),
	{increment,decrement}
)

react-redux的开发者工具

redux-devtools-extensionredux这个插件是官方提供的可以查看状态的ui插件,让我们在很多组件的情况下,也能知道每个组件的数据情况,非常贴心。

安装

 npm i redux-devtools-extension

配置

import {composeWithDevTools} from 'redux-devtools-extension'
...
const store = createStore(reducer,composeWithDevTools(applyMiddleware(thunk)))

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 数据类型

数据类型用于对数据归类&#xff0c;以便开发者理解和操作。 基本数据类型 Java 确定了每种基本数据类型所占存储空间的大小&#xff0c;不会像其它语言那样随机器硬件架构的变化而变化&#xff0c;这使 Java 程序更具可移植性。 Java 中定义了如下的基本数据类型。 byte …

【MobileNet V2】MobileNet V2

目录1、简介2、论文创新点1&#xff09;倒残差结构 -- Inverted residual block2&#xff09;ReLU63、网络结构文献名称&#xff1a;MobileNetV2: Inverted Residuals and Linear Bottlenecks 发表时间&#xff1a;2018年 下载地址&#xff1a;https://openaccess.thecvf.com/c…

Vue基础入门讲义(四)-组件化

文章目录1.引言2.定义全局组件3.组件的复用4.局部注册5.组件通信5.1.父向子传递props5.2.传递复杂数据5.3.子向父的通信1.引言 在大型应用开发的时候&#xff0c;页面可以划分成很多部分。往往不同的页面&#xff0c;也会有相同的部分。例如可能会有相同的头部导航。 但是如果…

第二章SpringBoot基础学习

文章目录SpringBoot依赖管理特性依赖管理开发导入starter场景启动器SpringBoot自动配置特性自动配好Tomcat自动配好SpringMVC默认的包结构各种配置拥有默认值按需加载所有自动配置项SpringBoot注解底层注解ConfigurationImport导入组件Conditional条件装配ImportResource导入Sp…

Python入门自学进阶-Web框架——33、瀑布流布局与组合查询

一、瀑布流&#xff0c;是指页面布局中&#xff0c;在显示很多图片时&#xff0c;图片及文字大小不相同&#xff0c;导致页面排版不美观如上图&#xff0c;右边的布局&#xff0c;因为第一行第一张图片过长&#xff0c;第二行的第一张被挤到第二列了。示例&#xff1a;def flow…

大数据框架之Hadoop:MapReduce(八)常见错误及解决方案

1、导包容易出错。尤其Text和CombineTextInputFormat。 2、Mapper中第一个输入的参数必须是LongWritable或者NullWritable&#xff0c;不可以是IntWritable. 报的错误是类型转换异常。 3、java.lang.Exception: java.io.IOException: Illegal partition for 13926435656 (4)&…

51单片机LCD1602的使用

文章目录前言一、LCD1602简单介绍二、LCD1602中各个引脚的作用四、LCD1602命令解析1.写命令2.写数据3.清屏指令4.光标归位指令5.进入模式设置指令6.显示开关控制指令7.设定显示屏或光标移动方向指令三、LCD1602代码编写四、代码测试总结前言 本篇文章将为大家讲解LCD1602的使用…

CPU扫盲-CPU如何执行指令以及流水线技术

在CPU扫盲-CPU与指令集中阐述了CPU与指令集之间的关系&#xff0c;并在CPU扫盲-自研指令集中以创造者的身份深入讲解了指令集&#xff0c;这篇文章则是针对CPU的专场&#xff0c;以x86架构下的CPU为例具体分析一下CPU如何执行指令。 计算机基本硬件由控制器、储存器、运算器、输…

基于java的五子棋游戏设计

技术&#xff1a;Java、JSP等摘要&#xff1a;随着互联网迅速的发展&#xff0c;网络游戏已经成为人们普遍生活中不可或缺的一部分&#xff0c;它不仅能使人娱乐&#xff0c;也能够开发人的智力&#xff0c;就像本文所主要讲的五子棋游戏一样能挖掘人们聪明的才干与脑袋的机灵程…

【大数据 AI 人工智能】数据科学家必学的 9 个核心机器学习算法

如今,机器学习正改变着我们的世界。借助机器学习(ML),谷歌在为我们推荐搜索结果,奈飞在为我们推荐观看影片,脸书在为我们推荐可能认识的朋友。 机器学习从未像在今天这样重要。但与此同时,机器学习这一领域也充斥着各种术语,晦涩难懂,各种机器学习的算法每年层出不穷…

思科2.7.6 Packet Tracer - Implement Basic Connectivity(作业)

Packet Tracer - 实施基本连接地址分配表目标第 1 部分&#xff1a;对 S1 和 S2 执行基本配置第 2 部分&#xff1a;配置 PC第 3 部分&#xff1a;配置交换机管理界面背景信息在这个练习中&#xff0c;您会首先执行基本的交换机 配置。然后您会通过在交换机和 PC 上配置 IP 编址…

【C++】string

【C修炼秘籍】string 目录 【C修炼秘籍】string 文章目录 前言 一、标准库里的string 二、string常用接口功能简介&#xff08;具体使用和底层转到模拟实现&#xff09; 1、string类的常见构造函数 2、string类对象的容量操作 3、string类对象的访问及遍历操作 4、 string类对象…

数影周报:LastPass数据泄露事件最新细节

本周看点&#xff1a;LastPass&#xff1a;关键运维员工遭定向攻击&#xff1b;Waymo今年第二轮裁掉137名员工&#xff1b;国家网信办发布《个人信息出境标准合同办法》&#xff1b;京麦商家“取消订单页面”升级&#xff1b;“智研汇”获千万级天使轮投资......数据安全那些事…

ubuntu-8-安装nfs服务共享目录

Ubuntu最新版本(Ubuntu22.04LTS)安装nfs服务器及使用教程 ubuntu16.04挂载_如何在Ubuntu 20.04上设置NFS挂载 Ubuntu 20.04 设置时区、配置NTP同步 timesyncd 代替 ntpd 服务器 10.0.2.11 客户端 10.0.2.121 NFS简介 (1)什么是NFS NFS就是Network File System的缩写&#xf…

W800系列||STM32最小版|CKLINK|待完善|学习(3-2):自制cklink调试工具测试(win11系统识别错误待解决)

续前文&#xff1a; W800系列|ST-LINK|STM32最小版|HEX文件|CKLINK|DebugServer|学习&#xff08;3-1&#xff09;&#xff1a;自制cklink调试工具_打酱油的工程师的博客-CSDN博客 硬件接线 CK-LINK W806 3V3 3V3 RST RST&#xff08;复位脚&#xff09; TCK CLK&…

MySQL日志管理

日志管理在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这种时候&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了数据库中数据丢失或被破坏可能原因&#xff1a;误删除数据库数据库工作时&a…

openpnp - error - 回位精度差的问题

文章目录openpnp - error - 回位精度差的问题概述齿隙矫正方法不能用openpnp默认的, 要自己选合适的方法ENDopenpnp - error - 回位精度差的问题 概述 用openpnp向导进行完x/y齿隙校正后, 进行回位精度测试. 在设备上挑选2个点: 主基准点次基准点 都是固定位置(将带mark点的…

Go中sync 包的 Once 使用

文章目录背景One 简介示例注意源码解读背景 在系统初始化的时候&#xff0c;某些代码只想被执行一次&#xff0c;这时应该怎么做呢&#xff0c;没有学习 Once 前&#xff0c;大家可能想到 声明一个标识&#xff0c;表示是否初始化过&#xff0c;然后初始化这个标识加锁&#x…

Lazada(来赞达)箱包什么产品好卖?东南亚热销国家选品分析

东南亚市场&#xff1a;存在巨大的跨境电商出口机遇 和2021年前对比&#xff0c;2022年越南、马来西亚等东南亚国家普遍实现了贸易正增长&#xff0c;欧美国家则多仍处于负增长状态。 同时2022年欧美等发达经济体通胀压力迅速抬升&#xff0c;这直接影响到国家间货币汇率&…

微信小程序如何配置并使用less?

微信小程序如何配置并使用less&#xff1f;1、在VScode中下载Less插件2、在微信小程序中依次点击如下按钮3、选中刚在vscode中下载安装的插件文件4、在设置中选中编辑器设置5、找到less进行json配置6、在json文件中的less.compile添加如下配置7、如何使用1、在VScode中下载Less…