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

react 状态管理

Redux

ReduxReact中常用的状态管理组件,类似于Vue中的Pinia(Vuex),可以独立于框架运行

作用: 通过集中管理的方式管理应用的状态

配套工具

react中使用redux,官方要求按照两个插件,Redux Toolkitreact-redux

Redux Toolkit 是官方推荐编写Redux逻辑的方式,是一套工具的集合集,简化书写方式

react-redux 用来连接reduxreact组件的中间件

npm i @reduxjs/toolkit react-redux

store目录结构设计

  • 通常集中状态管理的部分都会单独创建一个store目录
  • 应用通常会有多个子store模块,所以创建一个modules目录,在内部编写业务分类的子store
  • store中的入口文件index.js的作用是组合modules中所有的子模块,并导出store

在这里插入图片描述

使用

counterStore.js

import { createSlice } from "@reduxjs/toolkit";const counterStore = createSlice({// 名称name: "counter",// 初始化状态initialState:{count:0},//修改数据的同步方法reducers:{add(store){store.count++},sub(store){store.count--}}
})
// 结构出action对象中的函数
const {add,sub} = counterStore.actions
// reducer函数
const currentReducer = counterStore.reducer
// 导出
export default currentReducer
export {add,sub}

index.js

import { configureStore } from "@reduxjs/toolkit";import counterReducer from "./modules/counterStore";// 创建根store组合子模块
const store = configureStore({reducer:{counter:counterReducer}
})export default store;

为react注入store
react-redux负责把ReduxReact连接起来,内置Provider组件,通过store参数把创建好的store实例注入到应用中。

main.jsx 项目的入口文件

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import App from './App.jsx'
import './index.css'
import store from './store'
import { Provider } from 'react-redux'createRoot(document.getElementById('root')).render(<StrictMode><Provider store={store}><App /></Provider></StrictMode>,
)

在组件中使用

react组件中使用store中的数据,需要用到一个钩子函数useSelector,它的作用是把store中的数据映射到组件中

function App() {const counterReducer = useSelector(state => state.counter);return (<div><div>当前值:{counterReducer.count}</div></div>);
}

在这里插入图片描述
在这里插入图片描述
React组件中修改store中的数据需要借助另外一个hook函数——useDispatch,它的作用是生成提交action对象的dispatch函数

import './App.css'
import { useSelector,useDispatch } from 'react-redux';// 导入创建的action对象的方法
import { add, sub } from './store/modules/counterStore';
function App() {const counterReducer = useSelector(state => state.counter);// 获取dispatch函数const dispatch = useDispatch();return (<div><div>当前值:{counterReducer.count}</div>{/* 调用 */}<button onClick={() => dispatch(add())}>加一</button><button onClick={() => dispatch(sub())}>减一</button></div>);
}

在这里插入图片描述

提交action传参

reducers的同步修改方法中添加action对象参数,在调用ationCreater的时候传递参数,参数会被传递到action对象的payload属性上

import { createSlice } from "@reduxjs/toolkit";const counterStore = createSlice({// 名称name: "counter",// 初始化状态initialState:{count:0},//修改数据的同步方法reducers:{add(store){store.count++},sub(store){store.count--},addNum(store,action){store.count+= action.payload}}
})
// 结构出action对象中的函数
const {add,sub,addNum} = counterStore.actions
// reducer函数
const currentReducer = counterStore.reducer
// 导出
export default currentReducer
export {add,sub,addNum}
在这里插入代码片
import './App.css'
import { useSelector,useDispatch } from 'react-redux';// 导入创建的action对象的方法
import { add, sub,addNum } from './store/modules/counterStore';
function App() {const counterReducer = useSelector(state => state.counter);// 获取dispatch函数const dispatch = useDispatch();return (<div><div>当前值:{counterReducer.count}</div>{/* 调用 */}<button onClick={() => dispatch(add())}>加一</button><button onClick={() => dispatch(sub())}>减一</button>{/* 加三 */}<button onClick={() => dispatch(addNum(3))}>加三</button></div>);
}

在这里插入图片描述

异步操作

  • 创建store的方式不变,配置好同步修改状态的方法
  • 单独封装一个函数,在函数内部return一个新函数,在新函数中
    • 封装异步请求获取数据
    • 调用同步actionCreate传入异步数据生成的一个action对象,并使用dispatch提交
  • 组件中dispatch的写法不变

englishStore.js

import { createSlice } from "@reduxjs/toolkit";
const englishStore = createSlice({name: "englishstore",// 初始化状态initialState: {// 英文内容content: "",// 中文内容note: "",},// 修改内容reducers: {changeEnglish(store, action) {console.log(action.payload);store.content = action.payload.content;store.note = action.payload.note;},},
});// 结构出action对象中的方法
const { changeEnglish } = englishStore.actions;// 异步请求
const fetchEnglish = () => {return async (dispatch) => {const res = await fetch("https://api.oioweb.cn/api/common/OneDayEnglish");const data = await res.json();console.log(data);// 修改状态dispatch(changeEnglish(data.result));};
};// reducer函数
const englishReducer = englishStore.reducer;// 导出
export default englishReducer;
export { fetchEnglish };

使用


import { useEffect } from 'react';
import './App.css'
import { useSelector, useDispatch } from 'react-redux';
import { fetchEnglish } from './store/modules/englishStore';function App() {const englishReducer = useSelector(state => state.english)const dispatch = useDispatch()useEffect(() => {// 触发异步请求dispatch(fetchEnglish())}, [dispatch])return (<div><div>中文:{englishReducer.note}</div><div>英文:{englishReducer.content}</div></div>);
}export default App

在这里插入图片描述

相关文章:

  • 基于51单片机的温湿度上下限监测预警proteus仿真
  • TDD(时分双工 Time Division Duplexing)和FDD(频分双工 Frequency Division Duplexing)
  • Ruby基础语法
  • mTLS(Mutual TLS)即双向传输层安全,是一种安全通信协议,用于在客户端和服务器之间建立双向的身份验证和加密通道。
  • 网络编程自学(4)——异步服务器设计
  • cheese安卓版纯本地离线文字识别插件
  • Python批量处理客户明细表格数据,挖掘更大价值
  • DDL 超时,应该如何解决 | OceanBase 用户问题集萃
  • 指令个人记录
  • 安卓使用memtester进行内存压力测试
  • Python绘图库----turtle(海龟)
  • Sui Bridge今日正式上线Sui主网
  • Recaptcha2 图像识别 API 对接说明
  • 在矩池云使用 Llama-3.2-11B-Vision 详细指南
  • 开放式耳机究竟是不是智商税?百元蓝牙耳机2024推荐指南
  • [nginx文档翻译系列] 控制nginx
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【刷算法】从上往下打印二叉树
  • C++类的相互关联
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript 一些 DOM 的知识点
  • MySQL数据库运维之数据恢复
  • session共享问题解决方案
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于web的全景—— Pannellum小试
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 通过npm或yarn自动生成vue组件
  • 王永庆:技术创新改变教育未来
  • 一道闭包题引发的思考
  • 正则表达式
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​学习一下,什么是预包装食品?​
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #考研#计算机文化知识1(局域网及网络互联)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (06)Hive——正则表达式
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (ibm)Java 语言的 XPath API
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (层次遍历)104. 二叉树的最大深度
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (原创)可支持最大高度的NestedScrollView
  • **PHP分步表单提交思路(分页表单提交)
  • .cn根服务器被攻击之后
  • .dwp和.webpart的区别
  • .gitignore文件使用
  • .net core Swagger 过滤部分Api
  • .NET Core 发展历程和版本迭代
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 表达式计算:Expression Evaluator
  • .net 无限分类
  • ?.的用法