axios 请求的缓存封装

news/2025/1/16 0:00:04/

前言

咱们的网站或者程序,每一个页面和操作都需要请求后端接口来获取响应和渲染页面,抛开post请求方式的接口不说,部分get请求得到的数据,短时间内不会更新,或者短时间得到的响应数据不会变化,这个时候就可以把从接口得到的数据缓存下来,下次刷新或者是请求接口的时候,就不用请求接口,从而大幅度提高用户体验。

当然,如果服务器的流量很多且兆宽也比较大,可以自动忽略。

不过自研小网站,或者资讯类、文字类数据量比较大的程序就可以完全利用起来了。

实现

storage.ts

  • 首先肯定是需要缓存的工具类,来直接使用
/*** 封装操作localstorage本地存储的方法*/
export const storage = {//存储set(key: string, value: any, expires: number) {const obj = {value: value,expires: expires,//有效时间startTime: new Date().getTime() // 记录存储数据的时间,转换为毫秒值存下来}// 判断是否设置了有效时间if (obj.expires) {// 如果设置了时间,把obj转换数据类型转换为字符串对象存起来localStorage.setItem(key, JSON.stringify(obj))}else {// 如果没有设置有效时间,直接把value值存进去localStorage.setItem(key, JSON.stringify(obj.value))}},//取出数据get<T>(key: string) {// 先定义一个变量临时存放提取的值const temp = <T>JSON.parse(localStorage.getItem(key))// 判断有没有设置expires属性// 如果有,就需要判断是否到期了if (temp && temp != "undefined" && temp != "null" && temp.expires ) {let data = new Date().getTime()if (data - temp.startTime > temp.expires) {// 此时说明数据已过期,清除掉localStorage.removeItem(key)// 直接returnreturn}else {// 如果没有过期就输出return temp.value}}else {// 如果没有设置,直接输出return temp}},// 删除数据remove(key: string) {localStorage.removeItem(key)}
};/*** 封装操作sessionStorage本地存储的方法*/
export const sessionStorage = {//存储set(key: string, value: any) {window.sessionStorage.setItem(key, JSON.stringify(value))},//取出数据get<T>(key: string) {const value = window.sessionStorage.getItem(key)if (value && value != "undefined" && value != "null") {return JSON.parse(value)}return null},// 删除数据remove(key: string) {window.sessionStorage.removeItem(key)}
}

cacheAxios.ts

  • 其实就是将自己的axios请求做个处理,请求的时候用封装的工具请求类即可
  • 我举例的是localStorage,大家可以根据自行需要来使用sessionStorage
  • sessionStorage就没有cacheTime 了,可以自行设置
import axios from '@/utils/axios'
import { storage } from '@/utils/storage'interface optionsFace {isCache?: boolean; // 是否缓存cacheKey?: string; // 缓存key值cacheTime?: number; // 缓存默认值 默认为3天 86400 * 3,单位秒
}const request = async (config: any, {isCache = false, cacheKey, cacheTime = 86400 * 3}: optionsFace) => {// 判断是否需要缓存数据,if (isCache) {const cacheData = storage.get(cacheKey)if (cacheData) {// 有缓存数据直接返回return new Promise((resolve) => {resolve(cacheData)})}else {const resData = await axios(config)// 根据自己的接口来判断if (resData.code != 0) {storage.set(cacheKey, resData, cacheTime * 1000)}// 返回结果return new Promise((resolve) => {resolve(resData)})}} else {return axios(config)}
}export default request

api.ts

  • 接口工具类,使用方式就都一模一样的
// 使用封装的缓存axios
import request from '@/utils/cacheAxios';/*** 功能:获取 列表*/
export const getList = (params: Object, options: Object) => {return request({url: '/Wikipedia/getList',method: 'get',params: params}, options);
};

页面使用

/*** 功能:获取 首页数据*/
const getHome = () => {// 这里的cacheKey,可以拼接上页码// const cacheKey = 'homeData' + pageCurrent// 配置里还有个时间参数,工具类里是默认3天,可以自行设置getList({}, {isCache: true, cacheKey: 'homeData'}).then(res => {// 逻辑处理、即使是缓存得到的数据也是一样的,不会影响业务处理})
}

小结

  • 很多人可能不会使用这个多余的操作,可是我自研了中小型网站,很多数据需要频繁渲染,且数据都是一样的,所以需要如此来降低服务器的成本和前端体验
  • 缓存的数据,建议是列表类数据,全是明文的,这样即使别人拿到也没用
  • 本文是基于vue,不过react、小程序、uniapp改一下同样适用

http://www.ppmy.cn/news/1160387.html

相关文章

什么是高阶成分(HOC)

高阶组件&#xff08;Higher-Order Component&#xff0c;HOC&#xff09;是一种在React中用于组件复用和逻辑抽象的设计模式。它本质上是一个函数&#xff0c;接受一个组件作为参数&#xff0c;并返回一个新的组件。 1. HOC的作用&#xff1a; HOC允许我们在不修改原始组件的…

ChatGPT技术或加剧钓鱼邮件攻击

我们对ChatGPT这一新技术并不陌生&#xff0c;也早就听闻ChatGPT可以通过某种方式绕过安全机制&#xff0c;对目标进行入侵。 ChatGPT的“越狱”技术已经迭代数次&#xff0c;甚至有了先进的“邪恶GPT”WormGPT和FraudGPT&#xff0c;两者都能快速实现钓鱼邮件骗局。 安全分析…

[架构之路-240]:目标系统 - 纵向分层 - 应用层 - 应用层协议与业务应用程序的多样化,与大自然生物的丰富多彩,异曲同工

目录 前言&#xff1a; - 倒金子塔结构 - 大自然的组成 一、应用层在计算机系统中的位置 1.1 计算机应用程序的位置 1.1.1 业务应用程序概述 1.1.2 应用程序的分类 - 按照计算机作用范围 1.1.3 业务应用程序分类 - 按照行业分类 1.2 网络应用协议的位置 1.2.1 网络协…

C语言练习题-指针-(编写一个函数,接受一个整型数组和数组的长度作为参数,将数组中的元素按逆序存放)

文章目录 前言题目题目1简单的代码框架 题目2测试用例 题目3测试用例 参考答案题目1答案1解析 答案2解析 题目2答案1答案2 题目3答案1答案2 其他文章 前言 本篇文章的题目为C的基础练习题&#xff0c;指针部分。做这些习题之前&#xff0c;你需要确保已经学习了指针的知识。 本…

关于SparkRdd和SparkSql的几个指标统计,scala语言,打包上传到spark集群,yarn模式运行

需求&#xff1a; ❖ 要求:分别用SparkRDD, SparkSQL两种编程方式完成下列数据分析,结合webUI监控比较性能优劣并给出结果的合理化解释. 1、分别统计用户&#xff0c;性别&#xff0c;职业的个数&#xff1a; 2、查看统计年龄分布情况&#xff08;按照年龄分段为7段&#xff0…

创新与重塑,佛塑科技打造集团型 CRM 建设标杆

“十四五”时期是我国全面建成小康社会、实现第一个百年奋斗目标之后&#xff0c;乘势而上开启全面建设社会主义现代化国家新征程、向第二个百年奋斗目标进军的第一个五年。 在政府有序推进“十四五”规划的进程中&#xff0c;佛山佛塑科技集团股份有限公司&#xff08;证券简…

TCP通信-快速入门

TCP通信模式演示 注意&#xff1a;在java中只要是使用java.net.Socket类实现通信&#xff0c;底层即是使用了TCP协议。 Socket api public Socket(String host , int port) 创建发送端的Socket对象与服务端连接&#xff0c;参数为服务端程序的ip和端口。 OutputStream getO…

零代码编程:用ChatGPT根据excel表格数据来批量修改文件标题名

文件夹里面有很多个mp文件&#xff0c;没有顺序&#xff0c;很乱&#xff1a; 这些文件其实都是有顺序的&#xff0c;Excel表格中前面的数字就是序号&#xff1a; 现在&#xff0c;希望根据Excel表格中的标题名来对文件夹里的mp4文件进行批量重命名&#xff0c;在ChatGPT中输入…