当前位置: 首页 > news >正文

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 项目入口文件使用
import { Provider } from ‘react-redux’
// PersistGate 组件会在状态恢复完成后再渲染应用,避免“闪屏”
import { PersistGate } from 'redux-persist/integration/react'
import { store, persist } from './store'<Provider store={store}><PersistGate></PersistGate>
</Provider>

注意事项

  • 存储限制:localStorage 和 sessionStorage 有存储大小限制(通常为 5MB),对于较大的状态数据,可能需要考虑其他存储方案
  • 安全性:敏感数据(如用户凭证)不应直接存储在 localStorage 中,建议使用加密或其他安全措施。
  • 性能优化:对于频繁更新的状态,持久化操作可能会影响性能,建议通过白名单或黑名单进行优化。

相关文章:

  • 分布式AI推理的成功之道
  • 20250515通过以太网让VLC拉取视熙科技的机芯的rtsp视频流的步骤
  • RK3588 桌面系统配置WiFi和蓝牙配置
  • 1、数据结构与算法(Python版-啃书)-绪论
  • 前端流行框架Vue3教程:16. 组件事件配合`v-model`使用
  • 【Java ee初阶】http(1)
  • 左手坐标系、右手坐标系、坐标轴方向
  • 2、数据操作DMLDQL
  • 中间件-MQ常见问题
  • 基于AH1101芯片的5V升18.6V LED恒流背光供电方案设计
  • 从代码学习深度学习 - 实战 Kaggle 比赛:图像分类 (CIFAR-10 PyTorch版)
  • electron进程通信
  • constexpr 关键字的意义(入门)
  • 怎样用 esProc 实现连续区间的差集运算
  • 什么是 NB-IoT ?窄带IoT 应用
  • 【SPIN】用Promela验证顺序程序:从断言到SPIN实战(SPIN学习系列--2)
  • 华为Watch的ECG功能技术分析
  • 解决 Ubuntu 22.04 安装后启动卡死问题
  • recvfrom和sendto函数中地址参数的作用
  • C++算法(22):二维数组参数传递,从内存模型到高效实践
  • 阿里上财年营收增6%,蒋凡:会积极投资,把更多淘宝用户转变成即时零售用户
  • 美国调整对华加征关税
  • 三亚通报救护车省外拉警报器开道旅游:违规违法,责令公司停业整顿
  • 缺字危机:一本书背后有多少“不存在”的汉字?
  • 比特币挖矿公司GRYP股价涨超171%:将与特朗普儿子创设的公司合并
  • 全国层面首次!《防震减灾基本知识与技能大纲》发布