vue通过缓存请求数据提高首界面展示效率

news2024/11/24 7:37:44

我在组件中编写了这样一段代码

<template>
    <div class = "appp">
        <button @click = "getUser">请求数据</button>
    </div>
</template>

<script>
import axios from "axios";
export default {
    data() {
        return {
        }
    },
    methods: {
        getUser() {
            axios({
                url:"/user",
                headers:{
                }
            }).then(res=>{
                console.log(res.data.data);
            })
        }
    },
    mounted() {
        this.getUser();
    }
}
</script>

<style lang='scss' scoped>
</style>

我的跨域代理是这样的
在这里插入图片描述
然后 我们打开界面 mounted中调用getUser请求到数据
在这里插入图片描述
控制台输出
在这里插入图片描述
但当我们开发大项目的时候 他数据会比较慢
可能 用户进来要加载半天 接口请求有时没办法 就是慢 不过 我们可以换个思路 来提供一下加载第一页的效率 让用户访问某个模块 数据能马上出来
我们就可以通过缓存提升一下首次查询的效率
我们在src下创建文件夹
utils
下面创建一个cache.js
参考代码如下

/*
    处理系统数据缓存的类
 */
class cacheData{
    constructor(){
        this.updateTime = 1*60*1000; //更新时间1分钟
    }

    /*
        获取四个参数
        module  缓存模块的名字
        pid  缓存数据的条件 例如  父级id
        page  当前的分页页数  例如  第一页
    */
    init(module,pid,page){  //初始化查看

        //声明 Promise  异步操作
        return new Promise((resolve,reject)=>{
            
            //获取  storageData  缓存
            let getStorage = localStorage.getItem('storageData');
      
            //如果  storageData 这个缓存存在
            if(getStorage){
                //因为 storageData是转存字符串然后缓存 的  所以  先将他变回json
                getStorage = JSON.parse(getStorage);
                //获取当前时间的时间搓
                let currentTime = new Date().getTime();
                //记录结果是否有被找到的值
                let isBool = false;
                //最后会用currentRow记录缓存中查到的记录
                let currentRow;

                //循环遍历 storageData 中存的所有模块数据
                for(let i in getStorage){
                    //将 名称用-切分开 获取到完整的缓存模块名
                    let objKey = i.split('-');
            
                    //判断  如果缓存名 - 后面跟的数值 减去当前时间搓   表示已经过去了一分钟
                    if(currentTime-Number(objKey[2]) > this.updateTime){
                        //从整个缓存的对象中 删除当前模块的缓存
                        delete getStorage[i];
                    }else{
                        //判断当前的模块名-表示  是否有能匹配到  当前传的module和pid的
                        if(i.includes(`${module}-${pid}`)){
                            //如果有  将isBool赋值为true  表示找到了
                            isBool = true;
                            //用currentRow记录当前查到的值
                            currentRow = getStorage[i];
                        }
                    }
                }
          
                //判断isBool是不是 false   因为查看后 会赋值为true 所以  false  肯定就算没有找到对应的数据
                if(!isBool){
                    //直接用Promise的错误返回 告诉它我们没有找到数据
                    reject()
                }else{
                    /*
                        判断一下  首先currentRow是记录查到的数据的 所以 他必须有  然后  page要==1  我们只记录第一页的数据
                        只是保证用户刚进来数据能快点出来  但如果每一页都缓存  环境大小就扛不住了
                    */
                    if(currentRow && page == '1'){
                        //用Promise返回成功的方法  将currentRow传回给他
                        resolve(currentRow);
                        //调storageData 把数据再重新存一次
                        this.storageData(getStorage)
                    }else{
                        //如果条件没达到   返回Promise的错误方法  告诉它逻辑是有问题的
                        reject()
                    }
                }
            }else{
                //如果没有storageData缓存 直接返回Promise的错误函数  告诉她 这里找不到
                reject()
            }
        })         
    }
    /*
        接收三个参数
        module  当前模块名
        pid  参数表示  例如  父级的pid
        row   要换成的集合值
    */
    saveData(module,pid,row){ //保存数据
      
        if(row.page == '1' || !row.page || row.page == '0'){ //只保存第一页数据
            //获取当前时间搓
            let updateTime = new Date().getTime();
            //获取一下storageData缓存
            let storageData = localStorage.getItem('storageData');
            //判断一下storageData缓存是否存在
            if(storageData){
                //因为  我们会将json转字符串 再存进storageData  所以 要用之前 要用JSON.parse将他转回json
                storageData = JSON.parse(storageData);
                //然后循环遍历 缓存中所有的模块名
                for(let i in storageData){
                    //循环中判断 我们要存的模块内容是否存在
                    if(i.includes(`${module}-${pid}`)){
                        //如果有 直接把原来的干掉
                        delete storageData[i];
                    }
                }
                //然后  设置storageData  json 中键的内容是  module参数 - pid参数 - updateTime刚刚记录的当前时间搓 值是我们传进来的  要保存的row
                storageData[`${module}-${pid}-${updateTime}`] = row;
                //调用storageData 把缓存存进去
                this.storageData(storageData)
            }else{
                //如果没有获取到storageData  说明展示换成是空的  直接声明一个data对象
                let data = {};
                //然后在data下 声明键  键的内容是  module参数 - pid参数 - updateTime刚刚记录的当前时间搓 值是我们传进来的  要保存的row
                data[`${module}-${pid}-${updateTime}`] = row;
                //调用storageData将缓存存一下
                this.storageData(data)
            }
        }
    }
    /*
        接收两个参数
        module   要加入缓存的模块名
        pid  缓存数据的唯一标识  例如  父级id  参数 pid
    */
    forceUpdata(module,pid){   //清空指定模块缓存

        //获取storageData缓存
        let storageData = localStorage.getItem('storageData');
        //判断  storageData 这个缓存到底有没有 如果连storageData都没了 自然是不需要管它了
        if(storageData){
            //因为缓存存进来的时候是json转的字符串  所以 我们要通过JSON.parse 将他变回json
            storageData = JSON.parse(storageData);
            //循环遍历所有模块对应的缓存
            for(let i in storageData){
                //定义pidVal  接收 用户传入的pid  如果用户没传pid 就赋值为空字符串
                let pidVal = pid?`-${pid}`:'';
                //在 模块名中寻找能与  module模块名参数  pidVal表示参数 匹配的数据
                if(i.includes(`${module}${pidVal}`)){
                    //找到之后 从json中干掉
                    delete storageData[i];
                }
            }
            //调用storageData  将缓存重新存一下
            this.storageData(storageData)
        }
    }

    /*
        接收一个参数
        storageData要填入缓存的json
    */
    storageData(storageData){ //处理缓存传入的数据
        //用try 捕获异常  因为这里 如果内容太多 缓存是会超出大小的
        try {
            //能执行 表示大小可以存入  那就将storageData从json通过JSON.stringify转为字符串 然后存入到storageData缓存中
            localStorage.setItem('storageData',JSON.stringify(storageData));
        } catch (error) {
            //try语句 捕获到  缓存已经超出  那就直接将storageData缓存清掉
            localStorage.removeItem('storageData');
        }
       
    }
}

//将cacheData类暴露出去
export default new cacheData()

肢体注释 已经是非常努力的写了 大家可以去读一下这上面的逻辑
大体就是 根据模块名 和唯一标识 将数据缓存起来管理 然后 可以自己调用forceUpdata
清空掉指定模块的缓存 里面也写了 1分钟会更新一次 就会清空

然后 我们在src下的 main.js 中将他挂在vue的原型链上

import webCache from '@/utils/cache'
Vue.prototype.$webCache = webCache;

然后我们将组件内的代码改成这样

<template>
    <div class = "appp">
        <button @click = "getUser">请求数据</button>
        <button @click = "clear">清空缓存</button>
    </div>
</template>

<script>
import axios from "axios";
export default {
    data() {
        return {
        }
    },
    methods: {
        clear() {
            this.$webCache.forceUpdata('user' ,0);
        },
        getUser() {
            this.$webCache.init(`user`,0,'1').then((res)=>{
                console.log(res);
            }).catch( async ()=>{
                axios({
                    url:"/user",
                    headers:{

                    }
                }).then(res=>{
                    console.log(res.data.data);
                    this.$webCache.saveData('user',0,res.data.data); 
                })
            })
        }
    },
    mounted() {
        this.getUser();
    }
}
</script>

<style lang='scss' scoped>
</style>

我们第一次进入界面 还是一样的
在这里插入图片描述
控制台内容如下
在这里插入图片描述
然后 我们再点请求数据

控制台输出如下
在这里插入图片描述
可以看到数据查询还是正常的
然后 我们看网络
在这里插入图片描述
可以看到 这次 他一个请求都没发
我们刷新界面
在这里插入图片描述
因为有缓存 他走的就是这个逻辑了
在这里插入图片描述
然后 我们点击 清空缓存 再次点击 请求数据
在这里插入图片描述
这里就又去请求了 简单说 缓存可以通过forceUpdata清除 或者 一分钟之后缓存也会失效自动清除

然后 获取逻辑就是 如果获取得到缓存 就用缓存 获取不到 再去发请求 也是非常的好用
但这里写了个逻辑 只缓存模块第一页数据
这里也建议大家不要什么时间都往缓存里扔 会有问题的

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

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

相关文章

SQL Tips汇集及常见问题

SQL Tips汇集及常见问题 表与数据 -- 创建并初始化部门表DROP TABLE IF EXISTS dept; CREATE TABLE dept (deptno int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 部门编号,dname varchar(15) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMM…

蓝桥杯青少组python:第十三届省赛第二场

选择题 1、十进制 55 55 55转换为十六进制是() A、 1101111 1101111 1101111 B、 313 313 313 C、 37 37 37 D、 67 67 67 2、下列关于函数的说法正确是&#xff08;&#xff09; A、函数的定义必须的程序的开头 B、函数定义后&#xff0c;其中的程序就可以自动运行 C、函数定…

如何让技术架构师具有预知未来业务发展的能力

大家好&#xff0c;今天我们来分享业务架构&#xff0c;但是我们并不是以产品经理角度讲述一个业务架构是什么以及如何做&#xff1f;而是以一个技术架构师的角度&#xff0c;讲述如何承接业务架构或在没有业务架构的时候&#xff0c;如何判断业务变化趋势而对系统架构提前做出…

【Linux】2.4 使用 git 命令行

git git —— 一个版本管理的工具。 &#xff08;gitee/github 底层都是git&#xff0c;只是不同的网页化的结果&#xff09; 有否&#xff1f;&#xff1a;查看是否有git——git --version [RoundBottleVM-12-2-centos ~]$ git --version git version 1.8.3.1安装&#xff…

排查java进程被linux杀掉

1、查找进程 通过jps -l查找相关的进程发现进程已经不存在 2、查看服务日志 查看服务日志后&#xff0c;发现凌晨4点53并未产生相关的错误日志导致程序出现OOM&#xff0c;此时进行进一步分析&#xff0c;是否是linux杀掉了进程 3、查看linux系统日志 通过less /var/logs/me…

超越大数据的边界:Apache Flink实战解析【上进小菜猪大数据系列】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。欢迎订阅专栏 Apache Flink是一种快速、可靠、可扩展的开源流处理框架&#xff0c;被广泛应用于大数据领域。本文将介绍Apache Flink的实战运用&#xff0c;包括其核心概念、架构设…

Redis学习---04

一、Redis.conf配置文件 (1) units&#xff1a;对于大小写不敏感 导入 绑定ip和端口&#xff1a; (2) 通用&#xff1a; 以守护进程开启&#xff0c;默认为no 进程文件&#xff1a; 日志&#xff1a; 数据库的数量&#xff1a;是16个 是否显示logo&#xff1a; (3) 快照&…

探究ChatGPT与GPT-4的缺陷不足,揭示大预言LLM模型的局限性——没有完美的工具

目录 ChatGPT与GPT-4的缺陷不足——任何工具都不是万能的1. 引言2. 事实性错误2.1 问题示例2.2 原因分析2.3 解决方法 3. 实时更新3.1 问题示例3.2 原因分析3.3 解决方法 4. 总结 参考资料其它资料下载 ChatGPT与GPT-4的缺陷不足——任何工具都不是万能的 1. 引言 2022 年末 C…

借助TeeChart 图表控件,这家公司轻松创建了可视化图表看板

TeeChart for .NET是优秀的工业4.0 WinForm图表控件&#xff0c;官方独家授权汉化&#xff0c;集功能全面、性能稳定、价格实惠等优势于一体。TeeChart for .NET 中文版还可让您在使用和学习上没有任何语言障碍&#xff0c;至少可以节省30%的开发时间。技术交流Qqun&#xff1a…

版本控制工具之Git使用文档

以下讨论基于gitlab系统作为代码仓库。 项目Git初始化 创建一个空的git库或者初始化一个旧有git仓库 git init 现有项目关联到远程仓库 git remote add origin git172.16.200.39:public-team/spring-learn.git 下载代码 git clone <仓库地址> 查看已关联远程仓库 …

脑的物理系统

⼤脑模块化 人脑是一个复杂的网络&#xff0c;一般将大脑划分为不同的区域&#xff08;即节点&#xff09;&#xff0c;并使用某种方法表征大脑区域之间的关系&#xff08;即连接的边&#xff09;来构建人脑网络。在功能磁共振成像&#xff08;fMRI&#xff09;数据的网络模型…

浪涌保护器:保护电子设备免受雷击侵害

引言&#xff1a; 随着电子设备在现代生活和工业领域的普及和广泛应用&#xff0c;雷击对电子设备的损害成为一个严重的问题。浪涌保护器作为一种重要的防雷设备&#xff0c;发挥着至关重要的作用。本文将介绍浪涌保护器的防雷作用、行业应用&#xff0c;并重点介绍浪涌保护器…

SPI接口协议详解

一、SPI总线简介 SPI总线是摩托罗拉公司开发的一种高速、全双工、同步的通信总线&#xff0c;它通常由四条线组成&#xff1a; CS 片选信号SCLK 时钟信号MOSI 主机输出从机输入接口MISO 主机输入从机输出接口 SPI分为主机和从机&#xff0c;主机提供通信所需的时钟信号。 二…

盘点那些让人笑疯了的520创意文案!

520&#xff0c;一场关于爱情和狗粮的龙卷风快来了&#xff1a; 玫瑰花&#xff0c;涨价了&#xff1b; 民政局&#xff0c;周末要加班&#xff1b; 肯德基&#xff0c;推出了萌宠玩具套餐&#xff1b; 很多人&#xff0c;站在风里等那没影儿的爱情。 今天原本计划是要写一…

【JAVA程序设计】(C00137)基于SSM(非maven)的校园BBS论坛系统

基于SSM&#xff08;非maven&#xff09;的校园BBS论坛系统 项目简介项目获取开发环境项目技术运行截图 项目简介 本项目为基于SSM的校园BBS论坛管理系统包含前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1…

使用taro+canvas实现微信小程序的图片分享功能 | 京东云技术团队

业务场景 二轮充电业务中&#xff0c;用户充电完成后在订单详情页展示订单相关信息&#xff0c;用户点击分享按钮唤起微信小程序分享菜单&#xff0c;将生成的图片海报分享给微信好友或者下载到本地&#xff0c;好友可通过扫描海报中的二维码加群领取优惠。 使用场景及功能&a…

网站在腾讯云备案的要求条件说明

腾讯云网站备案要求首先你有一个需要备案的域名&#xff0c;域名实名认证信息和备案主体相同&#xff1b;在腾讯云有一台符合备案条件的云服务器、轻量应用服务器等云产品&#xff1b;然后根据备案主体所在省份地区&#xff0c;符合当地的通信管理局要求。下面腾讯云百科来详细…

相见恨晚的Matlab编程小技巧(4)-程序运行太慢了咋解决——合理使用循环语句(2)

上一篇博客介绍了通过向量化运算、预分配空间两种常用的方式提高代码的运行效率。实际上&#xff0c;matlab还有几种内置函数来避免循环语句的使用&#xff0c;分别为arrayfun、cellfun以及structfun函数。由于这几种函数需要用到匿名函数以及函数句柄的概念&#xff0c;很多人…

厚积薄发|迭代为什么叫冲刺?

上士闻道&#xff0c;勤而行之&#xff1b;中士闻道&#xff0c;若存若亡&#xff1b;下士闻道&#xff0c;大笑之。不笑不足以为道。–《道德经》 软件工程从原始的作坊式工作方式&#xff0c;经过了哪些思考、哪些方案的试探&#xff0c;才在不断地尝试与改善后&#xff0c;走…

E. Border(裴蜀定理)

Problem - E - Codeforces 太空人纳塔莎抵达了火星。她知道火星人非常贫穷。为了保障火星公民更好的生活&#xff0c;他们的皇帝决定向每个游客征收税费。纳塔莎是地球的居民&#xff0c;因此她必须支付进入火星领土所需的税费。 火星上有n种纸币面额&#xff1a;第i种纸币的面…