react中使用Redux管理token以及token持久化

server/2024/9/20 4:02:34/ 标签: react.js, javascript, ecmascript

1.安装插件

javascript">npm i @reduxjs/toolkit react-redux

2.新建状态管理文件

在src下新建store文件夹,store文件夹下新建模块文件夹(modules)和入口文件(index.js),modules文件夹下新建setToken.js文件

3.配置setToken.js

javascript">import { createSlice } from "@reduxjs/toolkit";
import axios from 'axios'const tokenStore = createSlice({name: 'setToken',initialState: {token: ''},reducers: {setToken(state, actions) {state.token = actions.payload}}
})const { setToken } = tokenStore.actions;
const tokenStoreReducer = tokenStore.reducer;// 异步请求
function login(data){return (dispatch)=>{axios.get('http://localhost:8888/token').then(res=>{dispatch(setToken(res.data))})}
}export { setToken,login }
export default tokenStoreReducer

4.注册setToken模块

src/store/index.js

javascript">// store/index.js该文件为状态管理的入口文件
// configureStore用于创建store实例
import { configureStore } from "@reduxjs/toolkit";// 导入子模块reducer,用于注册子模块
import tokenStoreReducer from "./modules/setToken";const store = configureStore({reducer:{ // 注册子模块的地方,可以注册多个子模块token:tokenStoreReducer}
})export default store

5.挂载store

src/App.js

javascript">// 该文件为主组件
import store from './store';
import { Provider } from 'react-redux';import router from './router';
import { RouterProvider } from 'react-router-dom'function App() {return (<RouterProvider router={router}><Provider store={store}></Provider></RouterProvider>);
}export default App;

6.登录页面调用状态管理中的异步请求获取token

javascript">import { Button, Checkbox, Form, Input, Card } from 'antd';
import './index.scss'
import { useState } from "react";
import { useNavigate } from 'react-router-dom';
import { useDispatch } from 'react-redux';
import { login } from '../../store/modules/setToken';function LoginPage() {const navigate = useNavigate()const dispatch = useDispatch()const [formParams, setFormParams] = useState({username: 'kanno',password: '123456',remember: ''})const onFinish = async (values) => { // 提交按钮await dispatch(login(values)) // 点击提交时调用状态管理中的异步请求方法获取tokennavigate('/home') // 跳转到home页面};const onFinishFailed = (errorInfo) => {console.log('Failed:', errorInfo);};return (<div className="login"><Card style={{ width: 500 }}><div className="title">登录</div><Formname="formParams"style={{width: '100%',}}initialValues={{remember: true,}}onFinish={onFinish}onFinishFailed={onFinishFailed}autoComplete="off"><Form.Itemlabel="名称:"name="username"rules={[{required: true,message: '请输入名称!',},]}><Input value={formParams.username} /></Form.Item><Form.Itemlabel="密码:"name="password"rules={[{required: true,message: '请输入密码!',}]}><Input.Password value={formParams.password} /></Form.Item><Form.Itemname="remember"valuePropName="checked"><Checkbox>记住密码</Checkbox></Form.Item><div className="bottom"><Button type="primary" htmlType="submit">提交</Button></div></Form></Card></div>);
}export default LoginPage;

6.说明

到这步就已经实现了将请求到的token存储在状态管理中,但是一旦刷新页面,存储在状态管理中的token就会丢失,因此,需要做token的持久化。

token持久化原理比较简单,就是在定义token状态变量的时候就将存储在本地存储的token赋值就行了。所以,在请求到token的时候就将token存储在状态管理和本地存储中,这样就算刷新存储在本地的token也不会丢失,就会在重新初始化的时候赋值到状态变量token中,从而达到token持久化的效果。

7.token持久化处理

在异步请求中存储到本地并且存储到状态管理中

src/store/modules/setToken.js 最终修改后的代码

javascript">import { createSlice } from "@reduxjs/toolkit";
import axios from 'axios'const tokenStore = createSlice({name: 'setToken',initialState: {token: localStorage.getItem('setToken')||'' // 从本地拿取token},reducers: {setToken(state, actions) {state.token = actions.payload;console.log("state.token",state.token);}}
})const { setToken } = tokenStore.actions;
const tokenStoreReducer = tokenStore.reducer;// 异步请求
function login(data){return (dispatch)=>{axios.get('http://localhost:8888/token').then(res=>{dispatch(setToken(res.data))localStorage.setItem('setToken',res.data); // 存储在本地})}
}export { setToken,login }
export default tokenStoreReducer

8.最终效果


http://www.ppmy.cn/server/93449.html

相关文章

Spring Cloud全解析:注册中心之初识Eureka

Eureka简介 关于Eureka Eureka是springCloud在一开始的时候推荐使用的注册中心&#xff0c;是Netflix开源的服务发现组件 Eureka包含两个组件&#xff1a;Eureka Server和Eureka Client Eureka Server提供服务注册服务&#xff0c;各个节点启动后&#xff0c;会在EurekaSer…

使用Echarts来实现数据可视化

目录 一.什么是ECharts? 二.如何使用Springboot来从后端给Echarts返回响应的数据&#xff1f; eg:折线图&#xff1a; ①Controller层&#xff1a; ②service层&#xff1a; 一.什么是ECharts? ECharts是一款基于JavaScript的数据可视化图标库&#xff0c;提供直观&…

【TS】TypeScript类型断言:掌握类型转换的艺术

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript类型断言&#xff1a;掌握类型转换的艺术1. 引言2. 什么是类型断言&a…

金融居间crm客户系统-助力金融居间企业实现高效的客户关系管理

在当今瞬息万变的金融居间领域&#xff0c;金融居间企业若想在激烈的竞争中脱颖而出&#xff0c;实现高效的客户关系管理至关重要。而鑫鹿金融居间CRM 客户系统的出现&#xff0c;恰如一把利剑&#xff0c;为企业披荆斩棘&#xff0c;开辟出一条通向成功的道路。 金融居间CRM 客…

如何学习自动化测试工具!

要学习和掌握自动化测试工具的使用方法&#xff0c;可以按照以下步骤进行&#xff1a; 一、明确学习目标 首先&#xff0c;需要明确你想要学习哪种自动化测试工具。自动化测试工具种类繁多&#xff0c;包括但不限于Selenium、Appium、JMeter、Postman、Robot Framework等&…

7月31日学习笔记 基于域名,Ip,端口多虚拟主机配置以及上线商城系统

一&#xff0c;基于域名的虚拟主机 效果 劫持域名访问指定的文件夹的目录 步骤 1. vim /usr/local/nginx/conf/nginx.conf 2. 创建新的目录 mkdir /html/devopt/ 3. 在 devops 目录下添加新的 index.html 文件 4. 在 http 模块下添加新的 server 模块 1 . 设置监听的端…

用ai来修改优化代码

前言 使用AI来辅助编写或修改技术文档是一个高效的方法&#xff0c;特别是当涉及到大型文档或需要快速更新内容时。下面是如何使用AI来编写或修改一篇技术文档的步骤和示例。 步骤概述 明确文档目的&#xff1a;确定文档的目标读者和主要内容。准备现有材料&#xff1a;整理…

亚马逊新产品怎么快速提升销量

经常有卖家吐槽新产品没销量&#xff0c;但卖家们的吐槽并不能把问题解决&#xff0c;南哥和大家分享一下关于测评的好处和一些技巧&#xff0c;以及如何样做才能提高店铺销量&#xff0c;将运营和测评结合起来做 测评的好处: 提升店铺信誉&#xff0c;制造爆款&#xff0c;增…

Conda和pip在安装Python包时有什么区别?

Conda和pip都是Python包管理工具&#xff0c;但它们在安装Python包时有一些关键的区别&#xff1a; 1. 包管理方式 Conda&#xff1a;不仅可以安装Python包&#xff0c;还可以安装非Python程序和库&#xff0c;如NumPy、SciPy等&#xff0c;以及它们依赖的系统库。Conda通过环…

【人工智能】穿越科技迷雾:解锁人工智能、机器学习与深度学习的奥秘之旅

文章目录 前言一、人工智能1. 人工智能概述a.人工智能、机器学习和深度学习b.人工智能发展必备三要素c.小案例 2.人工智能发展历程a.人工智能的起源b.发展历程 3.人工智能的主要分支 二、机器学习1.机器学习工作流程a.什么是机器学习b.机器学习工作流程c.特征工程 2.机器学习算…

FLV流分析

与上一篇TS流分析-CSDN博客一样的&#xff0c;FLV流也是用于音视频合成&#xff0c;且用于音视频传输。 相比于TS流&#xff0c;FLV的封装更为简单&#xff0c;其分为文件头&#xff08;File Header&#xff09;、文件体&#xff08;File Body&#xff09; 下面分别介绍这几部…

PHP表单验证邮件和URL

在PHP中验证表单中的电子邮件地址和URL地址是确保用户输入数据正确性的重要步骤。下面是一个详细的教程&#xff0c;介绍如何使用PHP来验证电子邮件和URL地址。 一、验证电子邮件地址 电子邮件地址的验证通常涉及检查字符串是否符合电子邮件的标准格式。虽然完全通过正则表达…

【技术支持】canvas转换为图片或PDF保存电脑

注意&#xff1a;有些网站可能由于canvas跨域污染问题&#xff0c;无法使用toBlob&#xff0c;所以无法转换 开发者工具中&#xff0c;选中需要转换的canvas元素&#xff08;使其可以使用$0语法&#xff09; 控制台输入如下代码 $0.toBlob(function (blob) {var link document…

java类型转换

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、integer与String类型转换二、字符串转换为数组三、进制转换四、集合转数组集合转换为类型一致的数组数组转换为类型一致的集合 一、integer与String类型转换 方…

Python面试整理-自动化运维

在Python中,自动化运维是一个重要的应用领域。Python凭借其简单易用的语法和强大的库支持,成为了运维工程师的首选工具。以下是一些常见的自动化运维任务以及如何使用Python来实现这些任务: 1. 文件和目录操作 Python的os和shutil模块提供了丰富的文件和目录操作功能。 impo…

【课程系列07】某乎AI大模型全栈工程师-第7期

网盘链接 链接&#xff1a;百度网盘 请输入提取码 --来自百度网盘超级会员v6的分享 课程目标 学习完毕咱们可以收获什么种能力&#xff1a; 1、传统前端 后端 数据分析 产品 绘图 算法工程等工作&#xff0c;一个人都可以实现&#xff0c;实现超级个体的能力 2、可以解决…

【考研数学】概率论:4 种方法解答一道题,你觉得哪种方法又快又好呢?

今天要给大家分享的笔记是&#xff1a;《用画图的方式求解概率论题目很方便&#xff0c;但难点在于如何画和怎么理解》 在这篇考研笔记中&#xff0c;「荒原之梦考研数学」为同学们提供了 4 种不同的方法解答这一道题目&#xff0c;其中最特别的是第一种通过画图求解的方法。 …

Spring框架中的@AliasFor注解

引言 在软件开发中&#xff0c;代码的清晰性和可维护性至关重要。Spring框架作为Java开发中广泛使用的框架之一&#xff0c;提供了丰富的注解来简化配置和提高开发效率。其中&#xff0c;AliasFor是一个重要的注解&#xff0c;它允许开发者定义属性别名&#xff0c;从而提高注…

探索电商 API 接口的创新应用与接入技巧

在当今数字化的商业环境中&#xff0c;电商 API 接口已成为推动业务增长和创新的关键因素。它们不仅为企业提供了与电商平台高效交互的途径&#xff0c;还开启了无数创新应用的可能性。本文将深入探讨电商 API 接口的创新应用&#xff0c;并分享一些实用的接入技巧&#xff0c;…

深度分析 !中国 AI 产业商业化实践案例 ! 2024 !

提供客户全渠道全生命周期的营服销一体化智能服务 京东云言犀依托于全栈自研的人工智能技术&#xff0c;基于京东集团广泛实体业务、庞大而又复杂的产业生态&#xff0c;从内部真实、复杂的海量业务场景实践中推出千亿级参数的言犀大模型&#xff0c;打造全新的智能交互与生成…