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::是一个纯函数,接受当前stateaction作为参数,并返回一个新的状态。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组件:用于将Reduxstore注入到整个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(高阶组件):用于将Reduxstatedispatch方法“连接”到React组件的props上。它主要用于类组件或早期函数组件(在hooks出现之前),现在虽然推荐使用useSelectoruseDispatch,但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:使用createStoreconfigureStore创建React store,并定义初始状态和reducer
  • 提供Store:通过Provider将store注入到React应用中
  • 连接组件:使用connect或Hooks API(useSelectoruseDispatch)将组件与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 中,建议使用加密或其他安全措施。
  • 性能优化:对于频繁更新的状态,持久化操作可能会影响性能,建议通过白名单或黑名单进行优化。

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

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

相关文章

Python字符串常用方法详解

文章目录 Python字符串常用方法详解一、字符串大小写转换方法(常用)1. 基础大小写转换2. 案例&#xff1a;验证码检查&#xff08;不区分大小写&#xff09; 二、字符串查找与替换方法1. 查找相关方法2. 替换相关方法 三、字符串判断方法1. 内容判断方法 四、字符串分割与连接方…

MyBatis—动态 SQL

MyBatis—动态 SQL 一、动态 SQL 的核心作用 动态 SQL 主要解决以下问题&#xff1a; 灵活性&#xff1a;根据不同的输入参数生成不同的 SQL 语句&#xff08;如条件查询、批量操作&#xff09;。 可维护性&#xff1a;减少重复代码&#xff0c;通过标签化逻辑提高 SQL 可读…

Python机器学习笔记(二十五、算法链与管道)

对于许多机器学习算法,特定数据表示非常重要。首先对数据进行缩放,然后手动合并特征,再利用无监督机器学习来学习特征。因此,大多数机器学习应用不仅需要应用单个算法,而且还需要将许多不同的处理步骤和机器学习模型链接在一起。Pipeline类可以用来简化构建变换和模型链的…

YOLOv3深度解析:多尺度特征融合与实时检测的里程碑

一、YOLOv3的诞生&#xff1a;继承与突破的起点 YOLOv3作为YOLO系列的第三代算法&#xff0c;于2018年由Joseph Redmon等人提出。它在YOLOv2的基础上&#xff0c;针对小目标检测精度低、多类别标签预测受限等问题进行了系统性改进。通过引入多尺度特征图检测、残差网络架构和独…

已解决(亲测有效!):安装部署Docker Deskpot之后启动出现Docker Engine Stopped!

文章目录 已解决&#xff1a;安装部署Docker Deskpot之后启动出现Docker Engine Stopped&#xff01;个人环境介绍自己的解决问题思路&#xff08;详细过程附截图&#xff09;1.打开控制面板2.点击程序和功能3.点击启动或关闭windows功能4.Hyper-V5.右键菜单栏的windows图标点击…

PCIE接收端检测机制分析

PCIE接收端检测机制分析 1、PCIE的接收端检测机制 接收器检测电路作为发射器的一部分实现&#xff0c;必须正确检测是否存在与ZRX-DC参数&#xff08;40Ω-60Ω&#xff09;隐含的直流阻抗等效的负载阻抗。 接收器检测序列的推荐行为如下&#xff1a; ‌初始状态‌&#xff…

[模型部署] 3. 性能优化

&#x1f44b; 你好&#xff01;这里有实用干货与深度分享✨✨ 若有帮助&#xff0c;欢迎&#xff1a;​ &#x1f44d; 点赞 | ⭐ 收藏 | &#x1f4ac; 评论 | ➕ 关注 &#xff0c;解锁更多精彩&#xff01;​ &#x1f4c1; 收藏专栏即可第一时间获取最新推送&#x1f514;…

InternVL3: 利用AI处理文本、图像、视频、OCR和数据分析

InternVL3推动了视觉-语言理解、推理和感知的边界。 在其前身InternVL 2.5的基础上,这个新版本引入了工具使用、GUI代理操作、3D视觉和工业图像分析方面的突破性能力。 让我们来分析一下是什么让InternVL3成为游戏规则的改变者 — 以及今天你如何开始尝试使用它。 InternVL…

鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集

ArkUI 组件速查表 鸿蒙应用开发页面上需要实现的 UI 功能组件如果在这 100 多个组件里都找不到&#xff0c;那就需要组合造轮子了 使用技巧&#xff1a;先判断需要实现的组件大方向&#xff0c;比如“选择”、“文本”、“信息”等&#xff0c;或者是某种形状比如“块”、“图…

HTTP GET报文解读

考虑当浏览器发送一个HTTP GET报文时&#xff0c;通过Wireshark 俘获到下列ASCII字符串&#xff1a; GET /cs453/index.html HTTP/1.1 Host: gaia.cs.umass.edu User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) Acc…

【Linux网络】数据链路层

数据链路层 用于两个设备&#xff08;同一种数据链路节点&#xff09;之间进行传递。 认识以太网 “以太网” 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容。例如&#xff1a;规定了网络拓扑结…

【打破信息差】萌新认识与入门算法竞赛

阅前须知 XCPC萌新互助进步群2️⃣&#xff1a;174495261 博客主页&#xff1a;resot (关注resot谢谢喵) 针对具体问题&#xff0c;应当进行具体分析&#xff1b;并无放之四海而皆准的方法可适用于所有人。本人尊重并支持每位学习者对最佳学习路径的自主选择。本篇所列训练方…

logrotate按文件大小进行日志切割

✅ 编写logrotate文件&#xff0c;进行自定义切割方式 adminip-127-0-0-1:/data/test$ cat /etc/logrotate.d/test /data/test/test.log {size 1024M #文件达到1G就切割rotate 100 #保留100个文件compressdelaycompressmissingoknotifemptycopytruncate #这个情况服务不用…

2025认证杯二阶段C题完整论文讲解+多模型对比

基于延迟估计与多模型预测的化工生产过程不合格事件预警方法研究 摘要 化工生产过程中&#xff0c;污染物浓度如SO₂和H₂S对生产过程的控制至关重要。本文旨在通过数据分析与模型预测&#xff0c;提出一种基于延迟估计与特征提取的多模型预测方法&#xff0c;优化阈值设置&a…

前端精度问题全解析:用“挖掘机”快速“填平精度坑”的完美解决方案

写在前面 “为什么我的计算在 React Native 中总是出现奇怪的精度问题?” —— 这可能是许多开发者在作前端程序猿的朋友们都会遇到的第一个头疼问题。本文将深入探讨前端精度问题的根源,我将以RN为例,并提供一系列实用解决方案,让你的应用告别计算误差。 一、精度问题的…

2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 解题报告 | 珂学家

前言 题解 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)。 国赛比省赛难一些&#xff0c;做得汗流浃背&#xff0c;T_T. RC-u1 大家一起查作弊 分值: 15分 这题真的太有意思&#xff0c;看看描述 在今年的睿抗比赛上&#xff0c;有同学的提交代码如下&#xff1…

hghac和hgproxy版本升级相关操作和注意事项

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;N/A 版本&#xff1a;4.5.6,4.5.7,4.5.8 文档用途 本文档用于高可用集群环境中hghac组件和hgproxy组件替换和升级操作 详细信息 1.关闭服务 所有数据节点都执行 1、关闭hgproxy服务 [roothgdb01 tools]# system…

userfaultfd内核线程D状态问题排查

问题现象 运维反应机器上出现了很多D状态进程&#xff0c;也kill不掉,然后将现场保留下来进行排查。 排查过程 都是内核线程&#xff0c;先看下内核栈D在哪了&#xff0c;发现D在了userfaultfd的pagefault流程。 uffd知识补充 uffd探究 uffd在firecracker与e2b的架构下使…

深入解析:构建高性能异步HTTP客户端的工程实践

一、架构设计原理与核心优势 HTTP/2多路复用技术的本质是通过单一的TCP连接并行处理多个请求/响应流&#xff0c;突破了HTTP/1.1的队头阻塞限制。在异步编程模型下&#xff0c;这种特性与事件循环机制完美结合&#xff0c;形成了高性能网络通信的黄金组合。相较于传统同步客户…

根据台账批量制作个人表

1. 前期材料准备 1&#xff09;要有 人员总的信息台账 2&#xff09;要有 个人明白卡模板 2. 开始操作 1&#xff09;打开 人员总的信息台账&#xff0c;选择所需要的数据模块&#xff1b; 2&#xff09;点击插入&#xff0c;选择数据透视表&#xff0c;按流程操作&…