【17】基础知识:reduxjs/toolkit

一、Redux Toolkit 概念了解

Redux Toolkit 是 Redux 官方强烈推荐,开箱即用的一个高效的 Redux 开发工具集。它旨在成为标准的 Redux 逻辑开发模式。

Redux Toolkit 最初是为了帮助解决有关 Redux 的三个常见问题而创建的:

"配置 Redux store 过于复杂""我必须添加很多软件包才能开始使用 Redux""Redux 有太多样板代码"

二、Redux Toolkit 使用

1、安装

# NPM
npm install @reduxjs/toolkit  react-redux# Yarn
yarn add @reduxjs/toolkit  react-redux

2、创建 store

src/store/index.js

// 使用 RTK 来构建 store
import { configureStore } from '@reduxjs/toolkit'
import studentReducer from './slicers/studentSlice'// 创建 store 用来创建store对象,需要一个配置对象作为参数
const store = configureStore({// 用来配置 store 中用到的 reducerreducer: {student: studentReducer}
})export default store

3、根组件配置 store

入口 index.js 文件

import ReactDOM from 'react-dom/client'
import App from './App'
import { Provider } from 'react-redux'
import store from './store'const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<Provider store={store}><App /></Provider>
)

4、createSlice 创建 reducer 的切片

src/store/slicers/studentSlice.js

// 它需要一个配置对象作为参数,通过对象的不同的属性来指定它的配置
import { createSlice } from '@reduxjs/toolkit'// state的初始值
const initialState = { name: '莉莉',info: {sex: '男'age: 18}
}export const studentSlice = createSlice({name: 'stu', // 命名空间,用来自动生成action中的type,name值会成为前缀;保证唯一,不重名initialState,reducers: { // 指定state的各种操作,直接在对象中添加方法// 可以通过不同的方法来指定对state的不同操作// 两个参数:state代理对象,可以直接修改;action操作的信息setName(state, action) {state.name = action.payload},setInfo(state, action) {state.info = action.payload}}
})// 切片对象会【自动】的帮助我们生成action;切片对象存在属性actions
// actions中存储的是slice自动生成action创建器(函数),调用函数后会自动创建action对象
// action对象的结构 {type:name/函数名, payload:函数的参数}
export const { setName, setInfo } = studentSlice.actions
// const nameAction = setName('哈哈') // { type: 'stu/setName', payload: '哈哈'}
// const infoAction = setInfo({sex:'女',age:18}) // { type: 'stu/setInfo', payload: {sex:'女',age:18}}// 简化useSelector使用,student来源于store里面配置的reducer
export const selectName = state => state.student.name
export const selectInfo = state => state.student.info// 导出reducer在store里面使用
export default studentSlice.reducer

5、页面使用

useDispatch() 用来获取派发器对象
useSelector() 用来加载 state 中的数据

import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { setName, setInfo, selectName, selectInfo } from './store/slicers/studentSlice'const App = () => {// 获取student中的name值// const name = useSelector(state => state.student.name)// 简化写法const name = useSelector(selectName) const info = useSelector(selectInfo)const dispatch = useDispatch()const setNameHandler = () => {dispatch(setName('哈哈'))}const setInfoHandler = () => {dispatch(setInfo({sex: '女', age: 18}))}return (<div><p>{name} ---{info.sex} ---{info.age} ---</p><button onClick={setNameHandler}>修改name</button><button onClick={setInfoHandler}>修改info</button></div>)
}export default App

三、redux-persist 持久化储存

在实际开发中,如果用户刷新了网页,那么我们通过 redux 存储的全局数据就会丢失,比如登录信息。可以通过 localStorage 将信息存储到本地,需要自己添加逻辑(了解)。

通过 redux-persist 实现持久化储存,使用过程:

1、 安装

npm install redux-persist

2、配置 store

import { configureStore } from '@reduxjs/toolkit'
import { combineReducers } from 'redux'
// 配置数据的持久化效果
import { persistStore, persistReducer} from 'redux-persist'
// 导入需要配置的数据源,可选storage、cookie、session等
import storage from 'redux-persist/lib/storage'
// import storageSession from 'redux-persist/lib/storage/session'
import userReducer from '@/store/slicers/userSlice'
import menuReducer from '@/store/slicers/menuSlice'// 合并多个模块
const reducers = combineReducers({user: userReducer,menu: menuReducer
})// 配置持久化设置
const persistConfig = {key: 'root',storage, // 持久化存储引擎// 可选的配置项,如白名单、黑名单等 选其一// blacklist: ['不想缓存的状态的名字'],// whitelist: ['想要缓存状态的名字']  
}// 创建持久化的配置persist的信息
const persistedReducer = persistReducer(persistConfig, reducers)// 创建存储对象并且抛出对象
export const store = configureStore({reducer: persistedReducer
})// 使用persistStore包裹并抛出
export const persistor = persistStore(store) 

3、index.js入口文件中配置

在入口文件中使用 PersistGate 包裹根组件,这将延迟渲染 app 视图直到持久化状态取回并保存到 redux 中。

将 store 提供给应用程序,persistor对象提供给根组件

import ReactDOM from 'react-dom/client'
import App from './App'
import { Provider } from 'react-redux'
// 导入redux中对应抛出的store对象和persistor对象
import { store, persistor } from '@/store'
// 如果使用React,则使用 PersistGate 包裹根组建
import { PersistGate } from 'redux-persist/lib/integration/react'const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<Provider store={store}><PersistGate loading={null} persistor={persistor}><App /></PersistGate></Provider>
)

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

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

相关文章

Failed to execute org.scala-tools:maven-scala-plugin:2.15.2解决

原因也不是很清楚&#xff0c;查看一个博主文章(net.alchim31.maven:scala-maven-plugin&#xff1a;maven依赖无法下载或无法编译)得到的解决方案&#xff1a; 在idea的terminal执行以下语句即可实现maven对scala代码的编译&#xff1a; mvn clean scala:compile compile pac…

从硬件到软件:揭秘磁盘结构和文件系统组织

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了从磁盘的硬件结构&#xff0c;再到操作系统内部是…

Redis维护缓存的方案选择

Redis中间件常常被用作缓存&#xff0c;而当使用了缓存的时候&#xff0c;缓存中数据的维护&#xff0c;往往是需要重点关注的&#xff0c;尤其是重点考虑的是数据一致性问题。以下是维护数据库缓存的一些常用方案。 1、先删除缓存&#xff0c;再更新数据库 导致数据不一致的…

OpenAI内斗剧情反转!微软力保ChatGPT之父回归?

美东时间11月17日下午&#xff0c;全球最热门的聊天机器人ChatGPT开发商OpenAI宣布了一项重磅管理层调整&#xff0c;Sam Altman将辞去CEO一职&#xff0c;并离开公司董事会。 Altman被踢出的消息除了让业界担心会影响该公司未来发展外&#xff0c;OpenAI另一位共同创办人暨总裁…

京东小程序:无代码开发实现API集成,连接电商平台、CRM和客服系统

无需复杂API开发&#xff0c;京东小程序连接电商平台 京东小程序平台以其全开放的生态模式&#xff0c;让商家享有京东系APP流量福利、海量SKU和开放能力&#xff0c;提升用户体验&#xff0c;同时也带来了新商机。京东小程序的最大优势在于&#xff0c;商家无需进行复杂的API…

系统设计之通讯协议

一、通讯协议 架构风格定义了应用程序编程接口 (API) 的不同组件如何相互交互。因此&#xff0c;它们通过提供设计和构建 API 的标准方法来确保效率、可靠性以及与其他系统集成的便捷性。以下是最常用的样式&#xff1a; 1. SOAP 成熟、全面、基于XML 最适合于企业应用 可扩展…

见面礼——图论

给定一个 n 个点 n 条边的无向图&#xff0c;你需要求有多少种选择图上的一个点 p 和一条边 (x,y) 的方案&#xff0c;使得删去 (x,y) 后图变成一棵树&#xff0c;且这棵树以 p 为根时每个节点的儿子个数均不超过 3。保证至少存在一种这样的方案。 Input 输入的第一行一个整数…

python functools.wraps保留被装饰函数属性

作用 普通装饰器 &#xff0c;会覆盖函数名称&#xff0c;并且 会替换 函数 文档字符串 介绍 functools.wraps(wrapped[, assigned][, updated]) This is a convenience function for invoking partial(update_wrapper, wrappedwrapped, assignedassigned, updatedupdated) …

城市生命线丨桥梁健康监测系统应用详情

现代城市当中&#xff0c;桥梁的重要性以及危险性是最高的&#xff0c;因此&#xff0c;对于桥梁的安全健康监测就会变得更加的重要&#xff0c;在科技发展的今天&#xff0c;新型基础设施已经能够准确、实时的监测桥梁的安全和健康。 WITBEE万宾助力建设更健康&#xff0c;智慧…

sentinel 网关

网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。 这样的架构&#xff0c;会存在…

【Python】12 GPflow安装

概述 GPflow 是一个基于TensorFlow 在 Python 中构建高斯过程模型的包。高斯过程是一种监督学习模型。 高斯过程的一些优点是&#xff1a; 不确定性是高斯过程的固有部分。高斯过程可以在不知道答案时告诉您。适用于小型数据集。如果您的数据有限&#xff0c;高斯过程可以从…

Yolov8部署——vs2019遇到的问题

Yolov8部署——vs2019遇到的问题 问题一&#xff1a; 默认库"LIBCMT"与其他库的使用冲突 解决方法&#xff1a;选择自己的项目右键属性——c/c——代码生成——运行库&#xff08;多线程&#xff08;/MT&#xff09; 问题二&#xff1a; 文件包含在偏移0x18处开始…

buildadmin+tp8表格操作(2)----表头上方按钮绑定事件处理,实现功能(全选/全不选)

buildAdmin 表格上方的按钮添加完成之后&#xff0c; 就要对其实现功能了 有了上面的说明&#xff0c; 我就只要得到了 ref 中的表格对象&#xff0c; 就可以象el-table 一样来操作表格的属性和方法了 我们来实现上面的几个按钮的方法 全选/全不选 上面就是添加按钮功能的全过…

算法——动态规划(新)

什么是动态规划&#xff1f; 动态规划算法的基本思想-求解步骤-基本要素和一些经典的动态规划问题【干货】-CSDN博客 一、三步问题 面试题 08.01. 三步问题 - 力扣&#xff08;LeetCode&#xff09; 思路 我们要知道&#xff0c;走楼梯&#xff0c;前三个阶梯步数已经知道&…

4-5学生分数对应的成绩

![#include<stdio.h> int main(){float score;char grade;for(int i0;i<7;i){printf("请输入成绩&#xff1a;");scanf("%f",&score);while(score>100||score<0){printf("\n输入的成绩有误&#xff0c;请重新输入&#xff1a;&quo…

深入了解百度爬虫工作原理

在当今数字化时代&#xff0c;互联网已经成为人们获取信息的主要渠道之一。而搜索引擎作为互联网上最重要的工具之一&#xff0c;扮演着连接用户与海量信息的桥梁角色。然而&#xff0c;我们是否曾经好奇过当我们在搜索引擎中输入关键词并点击搜索按钮后&#xff0c;究竟是如何…

mac 清除 iTerm2 终端屏幕内容

在 iTerm2 或 Mac 终端中清除当前屏幕上的所有内容&#xff0c;你可以使用以下快捷键&#xff1a; 1&#xff0c; clear 命令&#xff0c;仅仅清除当前屏幕&#xff0c;鼠标向上滚动时仍能看见旧的内容 2&#xff0c;Commd K&#xff0c;清除所有屏幕上的内容&#xff0c;鼠…

【18年扬大真题】给定有m个整数的递增有序数组a和有n个整数的递减有序数组b,将a数组和b数组归并为递增有序的数组c

【18年扬大真题】 给定有m个整数的递增有序数组a和有n个整数的递减有序数组b&#xff0c; 将a数组和b数组归并为递增有序的数组c。 void Merge(int arr[],int m ,int brr[],int n,int crr[]) {int i 0;int j n-1;int k 0;while(i < m&&j > 0) {if (arr[i] &l…

Cesium 问题:输出的 纬度 latitude 是 0

文章目录 问题分析问题 在坐标转换的时候,出现如下问题 分析 在检查代码后,发现我将转换之前的高度默认设置为了 0 ,因此没能正确转换 let positionsOnCircle = [];// 圆面边缘的点 let numPoints = 360; for (let i

asp.net在线考试系统+sqlserver数据库

asp.net在线考试系统sqlserver数据库主要技术&#xff1a; 基于asp.net架构和sql server数据库 功能模块&#xff1a; 首页 登陆 用户角色 管理员&#xff08;对老师和学生用户的增删改查&#xff09;&#xff0c;老师&#xff08;题库管理 选择题添加 选择题查询 判断题添加…