React18+TypeScript搭建通用中后台项目实战04 封装常用工具函数

接口请求参数类型

修改 src/api/request.ts

核心代码:

// GET 请求
// @param url 请求地址
// @param params 查询参数
// @return 返回Promise对象,内部类型是泛型
function get<T>(url: string, params: object): Promise<T> {return req.get(url, {params})
}// POST 请求
// @param url 请求地址
// @param data 请求参数
// @return 返回Promise对象,内部类型是泛型
function post<T>(url: string, data: object): Promise<T> {return req.post(url, data)
}

完整代码:

import axios from "axios";
import {message} from "antd";
import {hideLoading, showLoading} from "@/components/loading/Index.tsx";// 创建实例
const req = axios.create({baseURL: '/api',timeout: 3000,timeoutErrorMessage: "请求超时,请稍后再试",withCredentials: true, // 跨域headers: {'Content-Type': 'application/json',}
})// 请求拦截器
req.interceptors.request.use(// 拦截配置并更新配置config => {// 请求开始之前要展示加载状态showLoading()// 获取登录tokenconst token = localStorage.getItem("token")// 使用 JWT Tokenif (token) {config.headers.Authorization = "Bearer " + token}// 将修改后的配置返回return {...config}},// 拦截错误并注入错误信息error => {// 关闭加载状态hideLoading()// 返回错误信息return Promise.reject(error);}
)// 响应拦截器
req.interceptors.response.use(// 拦截正常响应response => {// 关闭加载状态hideLoading()// 获取服务端响应的数据const data = response.data// 响应成功if (data.code === 10000 && data.status === true) {return data.data}// 响应失败:权限错误if (data.code === 10401 || data.status === 10403) {message.error(data.msg)localStorage.removeItem("token")location.href = "/login"return}// 其他错误message.error(data.msg)return Promise.reject(data)},// 拦截错误响应error => {// 关闭加载状态hideLoading()// 返回错误信息message.error(error.message)return Promise.reject(error.message);}
)// GET 请求
// @param url 请求地址
// @param params 查询参数
// @return 返回Promise对象,内部类型是泛型
function get<T>(url: string, params: object): Promise<T> {return req.get(url, {params})
}// POST 请求
// @param url 请求地址
// @param data 请求参数
// @return 返回Promise对象,内部类型是泛型
function post<T>(url: string, data: object): Promise<T> {return req.post(url, data)
}// 导出
export {req,get,post,
}

封装 storage

src/util/storage.ts

// 全局的key,防止本地有多个项目同key冲突
const project_key = "zdpreact_tsadmin";// 设置值
// @param key 要存储的key
// @param value 要存储的value
function set(key: string, value: any) {key = `${project_key}__${key}`localStorage.setItem(key, JSON.stringify(value))
}// 读取值
// @param key 存储的key
function get(key: string) {// 读取key = `${project_key}__${key}`const value = localStorage.getItem(key)if (!value) return ''// 优先解析JSON,否则返回原值try {return JSON.parse(value)} catch (err) {return value}
}// 删除值
// @param key 存储的key
function remove(key: string) {key = `${project_key}__${key}`localStorage.removeItem(key)
}// 清空值,不建议使用
function clear() {localStorage.clear()
}// 存储对象
const storage = {set,get,remove,clear,
}
export default storage

测试

修改 src/page/Index.tsx

import {Button} from "antd";
import {useState} from "react";
import storage from "@/util/storage.ts";export default function Index() {const [value, setValue] = useState("")const handleSet = () => {storage.set("value", "hello")}const handleGet = () => {setValue(storage.get("value"))}const handleRemove = () => {storage.remove("value")setValue(storage.get("value"))}const handleClear = () => {storage.clear()setValue(storage.get("value"))}return (<div><h1>Index</h1><h2>当前值:{value}</h2><section><Button onClick={handleSet}>写入</Button><Button onClick={handleGet}>读取</Button><Button onClick={handleRemove}>删除</Button><Button onClick={handleClear}>清除</Button></section></div>)
}

此时,访问 http://localhost:5173/ 进行测试。

封装 number

src/util/number.ts

// 将数字转换为人民币格式
function rmb(num: number | string) {const value = parseFloat(num.toString())return value.toLocaleString("zh-CN", {style: "currency", currency: "CNY"})
}// 导出
export default {rmb,
}

测试

修改 src/page/Index.tsx

核心代码:

const handleGet = () => {const v  = storage.get("value")setValue(number.rmb(v))
}

完整代码:

import {Button} from "antd";
import {useState} from "react";
import storage from "@/util/storage.ts";
import number from "@/util/number.ts";export default function Index() {const [value, setValue] = useState("")const handleSet = () => {storage.set("value", "123456789")}const handleGet = () => {const v  = storage.get("value")setValue(number.rmb(v))}const handleRemove = () => {storage.remove("value")setValue(storage.get("value"))}const handleClear = () => {storage.clear()setValue(storage.get("value"))}return (<div><h1>Index</h1><h2>当前值:{value}</h2><section><Button onClick={handleSet}>写入</Button><Button onClick={handleGet}>读取</Button><Button onClick={handleRemove}>删除</Button><Button onClick={handleClear}>清除</Button></section></div>)
}

此时,访问 http://localhost:5173/ 进行测试。

封装 date

src/util/date.ts

// 日期格式化
function format(date?: Date, format?: string): string {// 获取日期时间对象let now = new Date()if (date) now = date// 日期switch (format) {case "date":return now.toLocaleDateString().replace("/", "-").replace("/", "-")case "time":return now.toLocaleTimeString()case "datetime":return now.toLocaleString().replace("/", "-").replace("/", "-")default:return now.toLocaleDateString()}
}// 导出
export default {format,
}

测试

修改 src/page/Index.tsx

核心代码:

const handleSet = () => {storage.set("value", date.format(new Date(), "datetime"))
}
const handleGet = () => {setValue(storage.get("value"))
}

完整代码:

import {Button} from "antd";
import {useState} from "react";
import storage from "@/util/storage.ts";
import date from "@/util/date.ts";export default function Index() {const [value, setValue] = useState("")const handleSet = () => {storage.set("value", date.format(new Date(), "datetime"))}const handleGet = () => {setValue(storage.get("value"))}const handleRemove = () => {storage.remove("value")setValue(storage.get("value"))}const handleClear = () => {storage.clear()setValue(storage.get("value"))}return (<div><h1>Index</h1><h2>当前值:{value}</h2><section><Button onClick={handleSet}>写入</Button><Button onClick={handleGet}>读取</Button><Button onClick={handleRemove}>删除</Button><Button onClick={handleClear}>清除</Button></section></div>)
}

此时,访问 http://localhost:5173/ 进行测试。

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

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

相关文章

YOLOv10 | 手把手教你利用yolov10训练自己数据集(含环境搭建 + 参数解析 + 数据集查找 + 模型训练、推理、导出)

一、前言 本文内含YOLOv10网络结构图 各个创新模块手撕结构图 训练教程 推理教程 参数解析 环境搭建 数据集获取等一些有关YOLOv10的内容&#xff01; 目录 一、 前言 二、整体网络结构图 三、空间-通道分离下采样 3.1 SCDown介绍 3.2 C2fUIB介绍 3.3 PSA介绍 …

微服务下认证授权框架的探讨

前言 市面上关于认证授权的框架已经比较丰富了,大都是关于单体应用的认证授权,在分布式架构下,使用比较多的方案是--<应用网关>,网关里集中认证,将认证通过的请求再转发给代理的服务,这种中心化的方式并不适用于微服务,这里讨论另一种方案--<认证中心>,利用jwt去中…

【数据库基础-mysql详解之索引的魅力(N叉树)】

索引的魅力目录 &#x1f308;索引的概念&#x1f308;使用场景&#x1f308;索引的使用&#x1f31e;&#x1f31e;&#x1f31e;查看MySQL中的默认索引&#x1f31e;&#x1f31e;&#x1f31e;创建索引&#x1f31e;&#x1f31e;&#x1f31e;删除索引 站在索引背后的那个男…

sheng的学习笔记-docker部署Greenplum

目录 docker安装gp数据库 mac版本 搭建gp数据库 连接数据库 windows版本 搭建gp数据库 连接数据库 docker安装gp数据库 mac版本 搭建gp数据库 打开终端&#xff0c;输入代码&#xff0c;查看版本 ocker search greenplum docker pull projectairws/greenplum docker…

Virtual Box安装Ubuntu及设置

Virtual Box安装Ubuntu及设置 本文包含以下内容&#xff1a; 使用Virtual Box安装Ubuntu Desktop。设置虚拟机中的Ubuntu&#xff0c;使之可访问互联网并可通过SSH访问。 Ubuntu Desktop下载 从官网下载&#xff0c;地址为&#xff1a;Download Ubuntu Desktop | Ubuntu U…

HTTP交互导致ECONNABORTED的原因之一

背景&#xff1a; 本次记录的&#xff0c;是一次使用HTTP交互过程中遇到的问题&#xff0c;问题不大&#xff0c;就是给题目上这个报错补充一种可能的解决方案。 程序大致流程&#xff1a; 1. 设备向服务器A请求信息 2. 拿到回复记录下回复内容中的数据包下载地址等信息 3…

games 101 作业4

games 101 作业4 题目题解作业答案 题目 Bzier 曲线是一种用于计算机图形学的参数曲线。在本次作业中&#xff0c;你需要实 现 de Casteljau 算法来绘制由 4 个控制点表示的 Bzier 曲线 (当你正确实现该 算法时&#xff0c;你可以支持绘制由更多点来控制的 Bzier 曲线)。 你需…

IntelliJ IDEA实用插件:轻松生成时序图和类图

IntelliJ IDEA生成时序图、类图 一、SequenceDiagram1.1 插件安装1.2 插件设置1.3 生成时序图 二、PlantUML Integration2.1 插件安装2.2 插件设置2.3 生成类图 在软件建模课程的学习中&#xff0c;大家学习过多种图形表示方法&#xff0c;这些图形主要用于软件产品设计。在传统…

解释Python中的多线程和多进程编程

在Python中&#xff0c;多线程&#xff08;Multithreading&#xff09;和多进程&#xff08;Multiprocessing&#xff09;是两种常见的并发编程技术&#xff0c;用于同时执行多个任务。然而&#xff0c;由于Python的全局解释器锁&#xff08;GIL&#xff0c;Global Interpreter…

C++实现定长内存池

项目介绍 本项目实现的是一个高并发的内存池&#xff0c;它的原型是Google的一个开源项目tcmalloc&#xff0c;tcmalloc全称Thread-Caching Malloc&#xff0c;即线程缓存的malloc&#xff0c;实现了高效的多线程内存管理&#xff0c;用于替换系统的内存分配相关函数malloc和fr…

文件压缩下载

工具类FileUtil import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream;/*** 文件工具类** author: 张…

Java面向对象知识总结+思维导图

&#x1f516;面向对象 &#x1f4d6; Java作为面向对象的编程语言&#xff0c;我们首先必须要了解类和对象的概念&#xff0c;本章的所有内容和知识都是围绕类和对象展开的&#xff01; ▐ 思维导图1 ▐ 类和对象的概念 • 简单来说&#xff0c;类就是对具有相同特征的一类事…

一篇文章学明白go语言,你想知道是那篇文章吗?

一篇文章彻底搞明白go语言&#xff0c; 你没有看错就是一篇文章可以让你彻底搞明白go语言&#xff0c;这篇文章就是go语言官方的 The Go Programming Language Specification &#xff0c; 你把这个搞明白&#xff0c;go语言也就明白了。 文章地址https://go.dev/ref/spec 这篇…

spring自定义初始化的加载顺序

构造函数>PostConstruct > afterPropertiesSet > init-method

MySQL——表内容的CURD操作

MySQL表内容的CURD ​ 与表内容相关的操作共有四种类型&#xff1a;Create(创建)&#xff0c;Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete(删除)&#xff1b; 一、Create 1.1单行插入多行插入全列插入/指定列插入 #全列插入&#xff0c;忽略列属性&#xff…

【Spring】认识 IoC 容器和 Servlet 容器

认识 IoC 容器和 Servlet 容器 1.认识容器1.1 IoC 容器1.2 loC 的实现方法1.2.1 依赖注入1.2.2 依赖查找 1.3 认识 Servlet 容器 2.用 IoC 管理 Bean2.1 创建一个 Bean2.2 编写 User 的配置类2.3 编写测试类 3.用 Servlet 处理请求3.1 注册 Servlet 类3.2 开启 Servlet 支持 1.…

力扣:1738. 找出第 K 大的异或坐标值

1738. 找出第 K 大的异或坐标值 给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 值 可由对所有满足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下标从 0 开始计数&…

线程间通信和进程间通信

线程间通信 #include <iostream> #include <thread> #include <queue> #include <mutex> #include <condition_variable> #include <chrono>// 全局变量 std::queue<int> data_queue; std::mutex mtx; std::condition_variable cv_…

启动小程序F12窗口管理器

如何使用小程序F12任务窗口管理器教学流程 一、引言 小程序的开发者们&#xff0c;是否希望有一款工具能帮助你们更好地管理任务窗口&#xff1f; 二、前置准备 观看视频教程 访问B站视频链接&#xff1a;https://www.bilibili.com/video/BV1aa4y197UU/?spm_id_from333.9…

晶圆厂的PE转客户工程师前景怎么样?

知识星球&#xff08;星球名&#xff1a; 芯片制造与封测技术社区&#xff0c;星球号&#xff1a; 63559049&#xff09;里的学员问&#xff1a; 目前在晶圆厂做PE&#xff0c;倒班oncall压力太大把身体搞坏了&#xff0c;现在有一个design house的CE客户工程师的offer&…