React学习———Redux 、 React Redux和react-persist
Redux
Redux是一个流行的JavaScript状态管理库,通常用于React等前端框架结合使用。Redux 的设计思想是让应用的状态变得可预测、可追踪、易于调试和测试。
Redux的核心l理念
- 单一数据源:整个应用的状态被存储在一个
唯一的Store
对象中,所有组件都从这个Store
读取数据 - 状态只读:唯一改变状态的方法时触发action,不能直接修改state
- 使用纯函数来执行修改:Reducer处理器是函数,接收当前的store和action,返回新的state,不产生副作用
Redux的核心概念
Store
:是Redux的核心,它是一个包含整个应用程序状态的对象。Redux应用只有一个单一的Store,通过createStore
函数创建。提供了以下的方法
-getStore()
:获取当前状态
-dispatch(action)
:触发状态更新
-subscribe(listener)
:监听状态变化Action
:一个普通的JavaScript对象,用于描述状态的变化,它必须有type
字段,表示动作的类型,可以有其他自定义数据
const incrementAction = {type: 'INCREATE',payload: 1
}
Reducer
::是一个纯函数,接受当前state
和action
作为参数,并返回一个新的状态。Reducer必须保持纯函数特性,既不直接修改原状态,而是返回一个新的状态对象
function counterReducer(state = 0,action){switch(action.type){case 'INCREATE':return state + action.payload;default:return state}
}
Dispatch
:用于触发action,通过调用store.dispatch(action)
。React会将action传递给Reducer,从而更新状态Subscribe
:订阅Store的状态,通常用于UI更新
Redux的工作流程
- 组件通过
dispatch
发送一个action
Store
接收到action
,调用reduce
Reducer
根据action
的类型和数据,返回新的state
Store
更新state
,通知订阅的组件重新渲染
React Redux
React Redux是官方推荐的React与Redux结合使用的库,主要作用是让React组件可以方便的访问和操作Redux的全局状态。它极大的简化了React项目中全局状态的管理和组件间的数据通信
React Redux的核心功能
Provider
组件:用于将Redux
的store
注入到整个React
应用中。只需在应用的根组件外包裹一次,所有的子组件都能访问到Redux
的状态
import { Provider } from 'react-redux'
import { store } from './store'
<Provider store={ store }><App />
</Provider>
useSelector
:在函数组件获取Redux store
里的状态;只会在依赖的状态变化时自动触发组件重新渲染
import { useSelector } from 'react-redux'
const menuIndex = useSelector(state => state.head.menuIndex)
useDispatch
:获取dispatch
方法,用于分发action
,触发reduce更新状态
import { useDispatch } from 'react-redux'
const dispatch = useDispatch()
dispatch({type: 'SET_MENU', payload: 1})
connect
(高阶组件):用于将Redux
的state
和dispatch
方法“连接”到React
组件的props
上。它主要用于类组件或早期函数组件
(在hooks出现之前),现在虽然推荐使用useSelector
和useDispatch
,但connect依然在很多老项目和复杂场景下被广泛使用
import { connect } from ‘react-redux’// 1、映射 state 到 props
const mapStateProps = (state) => ({menuIndex: state.head.menuIndex
})// 2、映射 dispatch 到 props
const mapDispatchProps = (dispatch) => ({setMenu: (index) => dispatch({type: 'SET_MENU'})
})// 3、用connect包裹组件
class MyComponent extends React.Component {render(){const { menuIndex, setMenu } = this.propsreturn (<div><span>{menuIndex}</span><button onClick={() => setMenu(1)}>切换菜单</button></div>)}
}
export default connect(mapStateProps, mapDispatchProps)(MyComponent)
React Redux的工作流程
- 创建Store:使用
createStore
或configureStore
创建React store,并定义初始状态和reducer - 提供Store:通过
Provider
将store注入到React应用中 - 连接组件:使用
connect
或Hooks API(useSelector
、useDispatch
)将组件与React store连接,获取状态和操作 - 更新状态:组件通过
dispatch
操作触发状态更新,Redux根据reduce更新store的状态 - 重新渲染:组件根据新的状态重新渲染,完成UI更新
react-persist
react-persist是一个用于持久化Redux状态的库,它的作用是:把Redux store中的数据自动保存到本地存储(如localStorage、sessionStorage、IndexedDB等),页面刷新或关闭后再打开,状态依然能恢复
基本使用
- 安装:
npm install redux-persist
- 配置
/** @format* createStore: 创建redux store* persistStore :持久化redux store* persistCombineReducers: 持久化多个reducer* storage:使用浏览器的lcaolStorage作为持久化存储介质*/
import { legacy_createStore as createStore } from 'redux'
import { persistStore, persistCombineReducers } from 'redux-persist'
import storage from 'redux-persist/lib/storage' // 默认 localStorageimport user from './reducers/user'
import head from './reducers/head'const persistConfig = {key: 'root', // 本地存储的key名storage, //存储方式 也可以用 sessionStorage 或自定义// whitelist: 只持久化那些reducer// blacklist:不持久化哪些reducer}
// 将多个reduce合并
const reducers = { user, head }
// 创建持久化存储的reducer
const persistedReducer = persistCombineReducers(persistConfig, reducers)
const store = createStore(persistedReducer)
const persist = persistStore(store)export { store, persist }
- 在React 项目入口文件使用
/*** PersistGate:用于在 React 应用中延迟渲染 UI,直到 Redux 持久化的数据恢复完成。* 当你用 redux-persist 持久化 Redux 状态时,页面刷新后需要先从本地存储(如 localStorage)恢复数据。* PersistGate 会在数据还原完成前,先渲染 loading 指定的内容(比如 loading 动画或 null),等数据恢复好后再渲染你的应用。*/
import { Provider } from ‘react-redux’
// PersistGate 组件会在状态恢复完成后再渲染应用,避免“闪屏”
import { PersistGate } from 'redux-persist/integration/react'
import { store, persist } from './store'<Provider store={store}>// persistor={persist} 是redux-persist创建的持久化控制对象<PersistGate loading={null} persistor={persist}></PersistGate>
</Provider>
注意事项
- 存储限制:localStorage 和 sessionStorage 有存储大小限制(通常为 5MB),对于较大的状态数据,可能需要考虑其他存储方案
- 安全性:敏感数据(如用户凭证)不应直接存储在 localStorage 中,建议使用加密或其他安全措施。
- 性能优化:对于频繁更新的状态,持久化操作可能会影响性能,建议通过白名单或黑名单进行优化。
相关文章:
React学习———Redux 、 React Redux和react-persist
Redux Redux是一个流行的JavaScript状态管理库,通常用于React等前端框架结合使用。Redux 的设计思想是让应用的状态变得可预测、可追踪、易于调试和测试。 Redux的核心l理念 单一数据源:整个应用的状态被存储在一个唯一的Store对象中,所有…...

小结: js 在浏览器执行原理
浏览器多进程与多线程 现代浏览器的标签环境隔离主要通过多进程架构和多线程机制实现,以确保安全、性能和稳定性。以下是浏览器实现标签环境隔离的多进程和多线程交互架构的详细解析: ------------------- ------------------- -----------…...

【实战篇】低代码报表开发——平台运营日报表的开发实录
前言 myBuilder的推广有段时间了,想开发个报表看看平台运营的情况。采用myBuilder强大的报表、数据交换模块功能,直接开干。 1. 报表指标思考与概要设计 首先是报表模块的概要设计,先构思一下,我希望报表能查看新用户注册、活跃…...
51 单片机头文件 reg51.h 和 reg52.h 详解
51 单片机头文件详解 51 单片机的头文件reg51.h和reg52.h是开发中非常重要的文件,它们定义了单片机的特殊功能寄存器 (SFR) 和位地址。以下是对这两个头文件的详细解析: 1. 头文件概述 reg51.h:针对标准 8051 单片机(4KB ROM, 128B RAM) reg52.h:针对增强型 8052 单片…...
PyTorch中.item()函数:提取单元素张量值
PyTorch中,.item()函数是什么 在PyTorch代码中,.item() 主要用于从一个只包含单个元素的张量(Tensor)中提取出对应的Python标量值 ,具体作用和使用场景如下: 作用 获取数值:当通过计算得到一个张量,且该张量仅包含一个元素时,使用 .item() 方法可以方便地将这个元素…...

使用Qt操作SQLite数据库
目录 一、开发成果二、环境配置与基础概念1. 引入SQL模块2. SQLite数据库特性三、数据库连接与操作流程1. 创建并连接数据库2. 执行SQL语句3. 查询与遍历数据四、进阶操作与最佳实践1. 事务处理2. 错误处理3. 使用模型/视图架构五、完整代码示例(学生人员管理)1.mainwindow.h…...

ZYNQ笔记(二十):Clocking Wizard 动态配置
版本:Vivado2020.2(Vitis) 任务:ZYNQ PS端 通过 AXI4Lite 接口配置 Clocking Wizard IP核输出时钟频率 目录 一、介绍 二、寄存器定义 三、配置 四、PS端代码 一、介绍 Xilinx 的 Clock Wizard IP核 用于在 FPGA 中生成和管理…...

探秘高可用负载均衡集群:企业网络架构的稳固基石
目录 高可用负载均衡集群 一、集群的本质与核心价值 二、高可用集群与负载均衡集群的定义 高可用集群(HA Cluster) 负载均衡集群(Load Balance Cluster) 三.高可用与负载均衡的完美融合 四.…...

JAVA:ResponseBodyEmitter 实现异步流式推送的技术指南
1、简述 在许多场景下,我们希望后端能够以流式、实时的方式推送数据给前端,比如消息通知、日志实时展示、进度条更新等。Spring Boot 提供了 ResponseBodyEmitter 机制,可以让我们在 Controller 中异步地推送数据,从而实现实时流式输出。 样例代码:https://gitee.com/lh…...

CSS- 1.1 css选择器
本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 系…...

ABP-Book Store Application中文讲解 - Part 2: The Book List Page
本章用于介绍如何创建Book List Page。 TBD 1. 汇总 ABP-Book Store Application中文讲解-汇总-CSDN博客 2. 前一章 ABP-Book Store Application中文讲解 - Part 1: Creating the Server Side 项目之间的引用关系。 目录 1. 多语言配置 1.1 zh-Hans.json 1.2 en.jso…...

08 web 自动化之 PO 设计模式详解
文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构?1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…...

langchain4j集成QWen、Redis聊天记忆持久化
langchain4j实现聊天记忆默认是基于进程内存的方式,InMemoryChatMemoryStore是具体的实现了,是将聊天记录到一个map中,如果用户大的话,会造成内存溢出以及数据安全问题。位了解决这个问题 langchain4提供了ChatMemoryStore接口&am…...

WebGL图形编程实战【7】:变换流水线 × 坐标系与矩阵精讲
变换流水线 #mermaid-svg-Omabd9LSNCdIvWqB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Omabd9LSNCdIvWqB .error-icon{fill:#552222;}#mermaid-svg-Omabd9LSNCdIvWqB .error-text{fill:#552222;stroke:#552222;…...
在Angular中使用Leaflet构建地图应用
Leaflet是一个用于创建地图的JavaScript库,它包含许多功能,并且非常适用于移动设备。 准备 nodejs: v20.15.0 npm: 10.7.0 angular: 19.2.10 创建一个地图应用工程 npx angular/cli new my-leaflet-app --stylecss --routingfalse --skip-tests提示 …...
鸿蒙next播放B站视频横屏后的问题
(此文讨论范围为b站视频链接,且不包括b站直播链接;android/iOS的webview播放b站视频完全没有这么多问题) 1、竖屏播放没问题 从一个竖屏页p1点击进入视频页p2,p2页仍为竖屏; p2页有一Web组件,…...

DVWA靶场通关笔记-SQL注入(SQL Injection Medium级别)
目录 一、SQL Injection 二、代码审计(Medium级别) 1、源码分析 (1)index.php (2)Medium.php 2、渗透思路 (1)SQL安全问题分析 (2)SQL渗透思路 三、…...

vue异步导入
vue的异步导入 大家开发vue的时候或多或少路由的异步导入 component: () >import(“/views/A_centerControl/intelligent-control/access-user-group”),当然这是路由页面,那么组件也是可以异步导入的 使用方式 组件的异步导入非常简单,主要是一个…...
【Redis】压缩列表
目录 1、背景2、压缩列表【1】底层结构【2】特性【3】优缺点 1、背景 ziplist(压缩列表)是redis中一种特殊编码的双向链表数据结构,主要用于存储小型列表和哈希表。它通过紧凑的内存布局和特殊的编码方式来节省内存空间。 2、压缩列表 【1…...

2025年,如何制作并部署一个完整的个人博客网站
欢迎访问我的个人博客网站:欢迎来到Turnin的个人博客 github开源地址:https://github.com/Re-restart/my_website 前言 2024年年初,从dji实习回来之后,我一直想着拓宽自己的知识边界。在那里我发现虽然大家不用java,…...
.NET 8 + Angular WebSocket 高并发性能优化
.NET 8 Angular WebSocket 高并发性能优化。 .NET 8 WebSocket 高并发性能优化 WebSocket 是一种全双工通信协议,允许客户端和服务端之间保持持久连接。在高并发场景下,优化 WebSocket 的性能至关重要。以下是针对 .NET 8 中 WebSocket 高并发性能优化…...

腾讯云运营开发 golang一面
redis为什么单线程会快 每秒10w吞吐量 io多路复用 一个文件描述符整体拷贝;调用epoll_ctl 单个传递 内核遍历文件描述符判断是否有事件发送;回调函数列表维护 修改有事件发送的socket为可读或可写,返回整个文件描述符;返回链…...

一个简单的静态页面
这个页面采用了现代化的 UI 设计,包括卡片式布局、微交互动画、分层设计和响应式结构。页面结构清晰,包含导航栏、英雄区域、功能介绍、产品特性、用户评价和联系表单等完整组件,可作为企业官网或产品介绍页面的基础模板。 登录后复制 <!D…...

使用 163 邮箱实现 Spring Boot 邮箱验证码登录
使用 163 邮箱实现 Spring Boot 邮箱验证码登录 本文将详细介绍如何使用网易 163 邮箱作为 SMTP 邮件服务器,实现 Spring Boot 项目中的邮件验证码发送功能,并解决常见配置报错问题。 一、为什么需要邮箱授权码? 出于安全考虑,大…...

多模态大语言模型arxiv论文略读(六十八)
Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文标题:Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文作者:Qiji Zhou, Ruoc…...

APS「多目标平衡算法」如何破解效率与弹性的永恒博弈
APS(高级计划与排程)系统作为企业智能制造的核心引擎,通过整合需求预测、产能规划、生产调度、物料管理及数据分析等模块,构建了覆盖产品全生产流程的“感知-决策-执行-优化”闭环体系。 精准需求预测 APS系统通过构建需求特征数…...

网张实验操作-防火墙+NAT
实验目的 了解防火墙(ENSP中的USG5500)域间转发策略配置、NAT(与路由器NAT配置命令不同)配置。 网络拓扑 两个防火墙连接分别连接一个内网,中间通过路由器连接。配置NAT之后,内网PC可以ping公网…...
Spring 中常见的属性注入方式(XML配置文件)
在 Spring 中,XML 配置属性注入。 以下是几种常见的属性注入方式及其对应的简单示例代码。 1. 构造器注入 构造器注入是指通过类的构造函数来设置依赖项。 示例类: public class MyService {private final MyRepository myRepository;public MyService(MyRepository myRe…...
让 - 艾里克・德布尔与斯普林格出版公司:科技变革下的出版业探索
在数字化浪潮席卷全球的当下,传统出版行业面临着前所未有的挑战与机遇。《对话 CTO,驾驭高科技浪潮》的第 10 章聚焦于让 - 艾里克・德布尔(Jean - Eric Debeure)及其所在的斯普林格出版公司(Springer Publishing Comp…...
【技巧】离线安装docker镜像的方法
回到目录 【技巧】离线安装docker镜像的方法 0. 为什么需要离线安装? 第一、 由于docker hub被墙,所以 拉取镜像需要配置国内镜像源 第二、有一些特殊行业服务器无法接入互联网,需要手工安装镜像 1. 可以正常拉取镜像服务器操作 服务器…...