React学习———Redux 、 React Redux和react-persist

news2025/5/17 2:09:44

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.props
		return (
			<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' // 默认 localStorage

import 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.coloradmin.cn/o/2377283.html

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

相关文章

小结: js 在浏览器执行原理

浏览器多进程与多线程 现代浏览器的标签环境隔离主要通过多进程架构和多线程机制实现&#xff0c;以确保安全、性能和稳定性。以下是浏览器实现标签环境隔离的多进程和多线程交互架构的详细解析&#xff1a; ------------------- ------------------- -----------…

【实战篇】低代码报表开发——平台运营日报表的开发实录

前言 myBuilder的推广有段时间了&#xff0c;想开发个报表看看平台运营的情况。采用myBuilder强大的报表、数据交换模块功能&#xff0c;直接开干。 1. 报表指标思考与概要设计 首先是报表模块的概要设计&#xff0c;先构思一下&#xff0c;我希望报表能查看新用户注册、活跃…

使用Qt操作SQLite数据库

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

ZYNQ笔记(二十):Clocking Wizard 动态配置

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

探秘高可用负载均衡集群:企业网络架构的稳固基石

目录 高可用负载均衡集群 一、集群的本质与核心价值​ 二、高可用集群与负载均衡集群的定义​ 高可用集群&#xff08;HA Cluster&#xff09;​ 负载均衡集群&#xff08;Load Balance Cluster&#xff09;​ 三&#xff0e;高可用与负载均衡的完美融合 四&#xff0e;…

JAVA:ResponseBodyEmitter 实现异步流式推送的技术指南

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

CSS- 1.1 css选择器

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 系…

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 进行自动化框架架构&#xff1f;1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…

langchain4j集成QWen、Redis聊天记忆持久化

langchain4j实现聊天记忆默认是基于进程内存的方式&#xff0c;InMemoryChatMemoryStore是具体的实现了&#xff0c;是将聊天记录到一个map中&#xff0c;如果用户大的话&#xff0c;会造成内存溢出以及数据安全问题。位了解决这个问题 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;…

DVWA靶场通关笔记-SQL注入(SQL Injection Medium级别)

目录 一、SQL Injection 二、代码审计&#xff08;Medium级别&#xff09; 1、源码分析 &#xff08;1&#xff09;index.php &#xff08;2&#xff09;Medium.php 2、渗透思路 &#xff08;1&#xff09;SQL安全问题分析 &#xff08;2&#xff09;SQL渗透思路 三、…

vue异步导入

vue的异步导入 大家开发vue的时候或多或少路由的异步导入 component: () >import(“/views/A_centerControl/intelligent-control/access-user-group”),当然这是路由页面&#xff0c;那么组件也是可以异步导入的 使用方式 组件的异步导入非常简单&#xff0c;主要是一个…

2025年,如何制作并部署一个完整的个人博客网站

欢迎访问我的个人博客网站&#xff1a;欢迎来到Turnin的个人博客 github开源地址&#xff1a;https://github.com/Re-restart/my_website 前言 2024年年初&#xff0c;从dji实习回来之后&#xff0c;我一直想着拓宽自己的知识边界。在那里我发现虽然大家不用java&#xff0c;…

腾讯云运营开发 golang一面

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

一个简单的静态页面

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

使用 163 邮箱实现 Spring Boot 邮箱验证码登录

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

多模态大语言模型arxiv论文略读(六十八)

Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文标题&#xff1a;Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文作者&#xff1a;Qiji Zhou, Ruoc…

APS「多目标平衡算法」如何破解效率与弹性的永恒博弈

APS&#xff08;高级计划与排程&#xff09;系统作为企业智能制造的核心引擎&#xff0c;通过整合需求预测、产能规划、生产调度、物料管理及数据分析等模块&#xff0c;构建了覆盖产品全生产流程的“感知-决策-执行-优化”闭环体系。 精准需求预测 APS系统通过构建需求特征数…

网张实验操作-防火墙+NAT

实验目的 了解防火墙&#xff08;ENSP中的USG5500&#xff09;域间转发策略配置、NAT&#xff08;与路由器NAT配置命令不同&#xff09;配置。 网络拓扑 两个防火墙连接分别连接一个内网&#xff0c;中间通过路由器连接。配置NAT之后&#xff0c;内网PC可以ping公网&#xf…