react ts redux 的配置和使用、解决浏览器刷新后数据不存在

安装

npm i @reduxjs/toolkit react-redux

浏览器插件 - Redux DevTools(推荐但不强制使用

src 下创建 store,其中 index.ts/index.js 作为modules中所有store的集合

store/index.ts配置

import { configureStore } from '@reduxjs/toolkit'const store = configureStore({reducer: {},
})// 后续使用useSelector时参数state的类型
export type RootState = ReturnType<typeof store.getState>
export type AppDispatch = typeof store.dispatchexport default store

index.ts或者main.ts中注册store

import React from 'react'
import ReactDOM from 'react-dom'
import './index.css'
import App from './App'
// 添加如下
import store from './store'
import { Provider } from 'react-redux'ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
)

现在已经全局注册了redux了

配置

在store/modules中新建counter.ts文件

同步配置

import { createSlice } from '@reduxjs/toolkit'
import type { PayloadAction } from '@reduxjs/toolkit'export interface CounterState {value: number
}const initialState: CounterState = {value: 0,
}export const counterSlice = createSlice({name: 'counter',initialState,reducers: {increment: (state:CounterState) => {state.value += 1},decrement: (state:CounterState) => {state.value -= 1},},
})// 这里的actions对应的是上面的reducers function
export const { increment, decrement } = counterSlice.actionsexport default counterSlice.reducer

异步

import { createSlice,createAsyncThunk } from '@reduxjs/toolkit'
import type { PayloadAction } from '@reduxjs/toolkit'export interface CounterState {value: number
}
const initialState: CounterState = {value: 0,
}export const counterSlice = createSlice({name: 'counter',initialState,// 同步操作reducers: {......},// 异步操作extraReducers(builder){// 这里的payload就是incrementAsync的返回值builder.addCase(incrementAsync.fulfilled,(state,{payload})=>{state.value += payload})}
})
// 定义异步函数
export const incrementAsync = createAsyncThunk("incrementAsync",async(p:number)=>{const res = await new Promise<number>(r=>{setTimeout(() => {r(p)}, 1000);})return res
})export const { incrementAsync } = counterSlice.actionsexport default counterSlice.reducer

在store/index.ts中注册

import { configureStore } from "@reduxjs/toolkit";
// 引入counterSlice.ts
import counterStore  from "./modules/counterSlice";const store = configureStore({reducer:{// 注册,注意名字要与counterSlice.ts中的name一致counter:counterStore}
})export type RootState = ReturnType<typeof store.getState>
export type AppDispatch = typeof store.dispatchexport default store 

使用

```
// useSelect用于选择操作哪个store

// useDispatch用于生成实例,该实例可以调用reducers的function
import { useSelector, useDispatch } from “react-redux”

// 引入index中的RootState类型 js项目不需要
import { AppDispatch, RootState } from “@/store”

// 引入functions
import { decrement, increment, incrementAsync } from “@/store/modules/counterSlice”

const Demo = () => {
const count = useSelector((state: RootState) => state.counter.value)
const dispatch: AppDispatch = useDispatch() // 异步函数必须加AppDispatch类型,否则报错,同步可以不添加
return (
<>


{count}

<button onClick={() => dispatch(increment())}>+1
<button onClick={() => dispatch(incrementAsync(2))}>+2
<button onClick={() => dispatch(decrement())}>-1
</>
)
}
export default Demo

>  原文件地址 https://blog.csdn.net/owo_ovo/article/details/135545732
>	redux中浏览器刷新后数据不存在了,可以存在浏览器缓存中也可以使用插件进行永久花村粗react-redux#	安装react-redux
npm i redux-persist
# 使用
> src/store/index.js

import { createStore } from ‘redux’
import {persistStore, persistReducer} from ‘redux-persist’
import storage from ‘redux-persist/lib/storage’
//引入汇总之后的reducer
import reducers from ‘./reducers’

import loading from ‘…/redux/reducers/loading’

//在localStorge中生成key为root的值
const persistConfig = {
key: ‘root’,
storage,
blacklist:[‘loading’] //设置某个reducer数据不持久化,
//注意单词的拼写!我就因为写错单词,找了半天,55555~

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

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

相关文章

JMeter--定时器--同步定时器

一、集合点 集合点是测试脚本中的一个标记&#xff0c;当每个虚拟用户执行到标记处时&#xff0c;会停留在标记处等待其他的虚拟用户&#xff0c;当达到预期设置的并发数时&#xff0c;标记处的所有用户同时启动执行后续的请求&#xff1b; 集合点会产生瞬间高并发&#xff0c;…

PHP反序列化漏洞原理(附带pikachu靶场演示)

1.反序列化概念 序列化:是将变量转换为可保存或传输的字符串的过程;实现函数是serialize()反序列化:就是在适当的时候把这个字符串再转化成原来的变量使用&#xff0c;就是序列化的逆过程。实现函数是unserialize() 直白一点就是&#xff1a;序列化是把对象转换成字节流&#…

SpringAOP从入门到源码分析大全(四)SpringAOP的源码分析

文章目录 系列文档索引六、EnableAspectJAutoProxy源码分析1、AnnotationAwareAspectJAutoProxyCreator源码&#xff08;1&#xff09;wrapIfNecessary方法&#xff08;2&#xff09;createProxy 2、getAdvicesAndAdvisorsForBean查找所有Advisor&#xff08;1&#xff09;find…

深入理解CAS机制-基础使用与三大问题

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 原子性问题 3. 乐观锁与悲观锁 4. CAS操作 5. CAS算法带来的三大…

Dynamic Wallpaper for Mac激活版:视频动态壁纸软件

Dynamic Wallpaper for Mac 是一款为Mac电脑量身打造的视频动态壁纸应用&#xff0c;为您的桌面带来无限生机和创意。这款应用提供了丰富多样的视频壁纸选择&#xff0c;涵盖了自然风景、抽象艺术、科幻奇观等多种主题&#xff0c;让您的桌面成为一幅活生生的艺术画作。 Dynami…

基于SpringCloudAlibaba的微服务稳定性设计

胡弦&#xff0c;视频号2023年度优秀创作者&#xff0c;互联网大厂P8技术专家&#xff0c;Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者&#xff0c;资深架构师&#xff0c;技术负责人&#xff0c;极客时间训练营讲师&#xff0c;四…

【教程】MySQL数据库学习笔记(五)——约束(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 第四章 《数据操…

Linux基本命令之正则表达式(转义字符)

一&#xff1a;查看二进制文件 strings 命令&#xff1a;strings 文件名 生成链接文件 ln 命令&#xff1a;ln 选项 源文件(f1) 链接文件&#xff08;f2&#xff09; 软连接&#xff1a;eg:ln -s f1 f2 软链接不能跨分区链接&#xff0c;但可以在同一分区的不同目录下链接…

go+react实现远程vCenter虚拟机管理终端

文章目录 React-VcenterDemoQuick Start React-Vcenter 基于go & react实现远程vSphere vcenter虚拟机终端console页面&#xff0c;提供与vcenter管理中的Launch Web Console相同的功能。 项目地址&#xff1a;react-vcenter Demo URL: http://localhost:3000 Quick St…

3-氨基苯硼酸接枝的透明质酸(HA-PBA)和聚乙烯醇(PVA )水凝胶负载胶束和药物

3-氨基苯硼酸接枝的透明质酸&#xff08;HA-PBA&#xff09;和聚乙烯醇&#xff08;PVA &#xff09;水凝胶负载胶束和药物 苯硼酸酯交联形成水凝胶的步骤&#xff1a; HA-PBA的制备&#xff1a;首先&#xff0c;3-氨基苯硼酸通过与透明质酸&#xff08;HA&#xff09;中的羧基…

关于Gitea 的简单介绍

在数字化时代&#xff0c;代码托管已成为软件开发的不可或缺的一部分。对于开源项目或企业内部开发团队而言&#xff0c;选择一款合适的代码托管平台至关重要。Gitea&#xff0c;作为一款开源的轻量级代码托管平台&#xff0c;以其易用性、高性能和灵活性&#xff0c;受到了越来…

Selenium web自动化测试环境搭建

Selenium web自动化环境搭建主要要经历以下几个步骤&#xff1a; 1、安装python 在python官网&#xff1a;Welcome to Python.org&#xff0c;根据各自对应平台如&#xff1a;windows&#xff0c;下载相应的python版本。 ​ 下载成功后&#xff0c;点击安装包&#xff0c;一直…

力扣216---组合总和III(Java、递归回溯)

目录 题目描述&#xff1a; 思路描述&#xff1a; 代码&#xff1a; 题目描述&#xff1a; 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组…

将数据库中的数据接入Echarts图表

将数据库中的数据接入Echarts图表 要在ECharts图表中接入数据库的数据&#xff0c;需要以下步骤&#xff1a; 连接数据库&#xff1a; 使用Python、Java、Node.js等后端语言&#xff0c;通过对应的数据库驱动&#xff08;如mysql-connector-python、JDBC、mysqljs等&#xff09…

数据结构10:堆和堆排序

文章目录 树的概念及结构树的概念树的相关概念树的表示树在实际中的应用表示文件系统的目录树结构 二叉树概念及结构概念特殊的二叉树二叉树的性质二叉树的存储结构顺序存储链式存储 二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构 堆的实现堆的插入堆的删除堆的创建向…

【数据结构】08排序

08 排序 1. 冒泡排序&#xff08;BubbleSort&#xff09;1.1 循环嵌套实现1.2 递归实现 2. 选择排序2.1 嵌套循环实现2.2 递归实现 3. 插入排序4. 希尔排序4.1 代码实现 5. 快速排序5.1 代码实现6. 归并排序6.1 递归实现6.2 循环实现 7. 堆排序7.1 构建大顶堆7.2 堆排序7.3 代码…

考研依据数学思维导图,整理出的章节知识大纲

线性代数 | 整体写 | 第二章矩阵及其运算|整体文档|(思维导图&#xff0c;概念&#xff09;-CSDN博客 线性代数 | 分开写 | 第二章 矩阵及其运算 | 1 线性方程组和矩阵-CSDN博客 线性代数 | 分看写 |第二章 矩阵及其运算 | 2 矩阵的运算-CSDN博客 线性代数 | 分开写 |第二章 …

春秋云镜 CVE-2023-51048

靶标介绍&#xff1a; S-CMS v5.0 被发现存在SQLI。 开启靶场 根据题目查找S-CMS v5.0漏洞&#xff0c;百度没有查询到&#xff0c;使用必应搜索S-CMS v5.0 查找到githubCVE-2023-51052的描述 S-CMS v5.0 was discovered to contain a SQL injection... CVE-2023-51052 Git…

达梦数据库的AWR报告

达梦数据库的AWR报告 数据库快照是一个只读的静态的数据库。 DM 快照功能是基于数据库实现的&#xff0c;每个快照是基于数据库的只读镜像。通过检索快照&#xff0c;可以获取源数据库在快照创建时间点的相关数据信息。 为了方便管理自动工作集负载信息库 AWR&#xff08;Auto…

C++修炼之路之多态---多态的原理(虚函数表)

目录 一&#xff1a;多态的原理 1.虚函数表 2.原理分析 3.对于虚表存在哪里的探讨 4.对于是不是所有的虚函数都要存进虚函数表的探讨 二&#xff1a;多继承中的虚函数表 三&#xff1a;常见的问答题 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗--…