vue3利用keepAlive缓存页面

news2024/9/27 7:21:47

场景介绍

项目中经常会有这么一个需求,一个表单页面,可能需要跳转其他页面拿到对应的数据,再跳回表单页面,但是之前填写过的数据还在。而某些页面跳这个表单页面的时候,是不需要缓存,因为他是新增,如果是缓存的话,那么上次填的数据,下次进入这个表单页面的时候,那么数据还存在,明显不符合设计的要求。

需求分析

因为项目中使用的是 vue3,所以对于页面缓存,第一时间想到就是利用 keepAlive 做缓存,但是如果不做其他处理的话,仅仅简单使用 keepAlive 会带来一些问题,就像上面说的,如果上次填的数据,回退到上一个页面,再进来表单页,那么上次填的数据还存在,那么,我们该怎么去清掉缓存,什么时候又加入缓存呢,而且清缓存和加入缓存的时机,我们又怎么把握呢,这就是我们需要解决的难题。

1. 动态 include 数组

一开始,我想到的是,维护 keepAlive 的 include 数组,这个数组我使用的是 set 数据结构,因为有比较方便的增删方法,而且不重复,代码如下:

// useCache.ts
import { ref } from "vue";

const KEEP_ALIVE_SET = ref(new Set([]));

export default () => {const setKeepAlive = <T extends "add" | "delete">( operate: T,value: number ) => {KEEP_ALIVE_SET.value[operate](value);};return {KEEP_ALIVE_SET,setKeepAlive};
}; 
<!-- App.vue -->
<template><router-view v-slot="{ Component }"><transition name="router-fade" mode="out-in"><keep-alive :include="Array.from(KEEP_ALIVE_SET)"><component :is="Component" /></keep-alive></transition></router-view>
</template> 

关于这里 setKeepAlive 的时机的心智负担着实有点大,因为 add 的时候,存在着大量的页面进行 add,即使用了路由守卫去设置,逻辑的编写也充斥着代码本身,随着页面变多,这心智负担也会呈现直线增长,并且这还会有一个 bug,当 add 缓存的时候,首次进入缓存页面,其实他还没缓存下来,我们都知道 keepAlive 执行缓存,需要首次进入页面的时候记录下来,之后再进入的时候,判断该页面是否已经加载过,就不执行重新渲染,也就造成了,缓存能生效是在第二次进入这个页面的时候,这明显与我们的预想不符合,所以该方案也就 pass 掉了。

2. 时间戳 key

我们回顾下关于在 vue 中的 key 属性:

key 这个特殊的 attribute 主要作为 Vue 的虚拟 DOM 算法提示,在比较新旧节点列表时用于识别 vnode。如果 key 相同,会最小化触发重新渲染(达到缓存的目的),如果 key 不同,那么肯定会发生替换。

主要代码

// useCache.ts
import { ref } from "vue";

const kEEP_ALIVE_MAP = ref(new Map([]));

export default () => {const setKeepAlive = (key: string, value: number) => {kEEP_ALIVE_MAP.value.set(key, value);};return {kEEP_ALIVE_MAP,setKeepAlive};
}; 
<!-- App.vue -->
<template><!-- 利用缓存的时间戳key 保证页面保鲜 --><router-view v-slot="{ Component }"><keep-alive :max="5"><component:is="Component"v-if="$route.meta.keepAlive":key="$route.meta.keepAlive ? kEEP_ALIVE_MAP.get($route.name) : $route.path"/></keep-alive><component:is="Component"v-if="!$route.meta.keepAlive":key="$route.name"/></router-view>
</template> 

a 页面去到表单页,不需要缓存:

const goAddOrdersPage = () => {// 设置时间戳key 保证每次从这个页面跳转,key都是最新的,进入表单页也就一直重新渲染setKeepAlive("AddOrder", new Date().getTime());router.push({name: "AddOrder"});
}; 

b 页面操作完成后,回到表单页面,需要缓存:

// 路由导航守卫
onBeforeRouteLeave((to, from, next) => {// 如果不是去的表单页面,那么就重新更新表单页面的key,否则的话,就直接next,这样就可以在表单页面用到的key还是旧的时间戳key,以此达到缓存目的if (to.name !== "AddOrder") {setKeepAlive("AddOrder", new Date().getTime());}next();
}); 

总结

在维护该 key 的时候,我使用的是一个全局变量维护,利用 hooks 的形式,在各个页面之间进行设置,当然这只是比较简单的一种处理方法,其实方法有很多,也可以用状态管理器 vuex 或 pinia。注意:如果用路由 params 进行传值,vue-router 会给出警告,目前这个方案是官方也不建议的,而且我自己也试过,params 会获取不到值。

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

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

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

相关文章

通过Facebook建立反链:SEO角度

最近我有一个朋友的网站做得很不错&#xff0c;每天都在增加反链。反链对于网站来说&#xff0c;好处是显而易见的&#xff0c;能够提升搜索引擎对网站的认可度&#xff0c;增强用户对网站的信任度。另外一个方面的好处是&#xff0c;反链可以提高流量&#xff08;或者转化率&a…

想考个PMP证书,要怎么报考?

pmp 报考条件没他们说的那么难&#xff0c;什么 4500/7500 个小时的项目管理经验&#xff0c;这个条件看起来很难&#xff0c;其实项目无处不在&#xff0c;画一幅画&#xff0c;做一餐饭&#xff0c;都能算一个项目&#xff0c;这 4500个小时、7500 个小时很快就达到了。一、报…

三十、Kubernetes中kube-proxy三种工作模式详解

1、概述 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题&#xff0c;kubernetes提供了Service资源&…

2023-01-18 ClickHouse之聚合功能源码分析

前言 聚合分析是从海量数据中提取数据的基本方法&#xff0c;对于OLAP数据库而言&#xff0c;聚合分析是其关键能力之一&#xff0c;ClickHouse在这方面也做了很多设计和优化&#xff0c;正如ClickHouse在文档中所述&#xff1a; 本文将分析展示ClickHouse的聚合功能的工作原理…

NFS 导出的共享信息披露漏洞问题解法

输入&#xff1a;shoumount -e&#xff0c; 如果有目录信息&#xff0c;则说明有NFS 导出的共享信息披露漏洞。 如果处理了就应显示如下图&#xff1a; 解法如下&#xff1a; 1&#xff09;备份需要修改的文件 cp /etc/hosts.allow /etc/hosts.allowbak cp /etc/hosts.deny…

前端js实现文件多次添加累加上传和选择删除(django+js)

前言 原本的多文件上传功能在选择文件时&#xff0c;只能通过同一范围的鼠标框选或者ctrl/shift多选取选择文件&#xff0c;这样选择文件很不灵活&#xff0c;而且在确定之后如果漏选了文件&#xff0c;再次点击上传按钮时会清空表单里的文件信息&#xff0c;只能重复之前的操…

springcloudalibaba整合nacos

文章目录1.版本配置2.搭建项目2.1idea新建项目2.2项目依赖2.3测试初始项目2.4项目的配置文件3.nocas的配置文件4.进行测试4.1准备测试的文件4.2测试nacos安装&#xff1a; nacos下载安装 1.版本配置 2.搭建项目 2.1idea新建项目 选择springcloudalibaba和springboot版本 spr…

Minecraft 1.19.2 Forge模组开发 10.3D动画盔甲

Minecraft 1.16.5模组开发3D盔甲 Minecraft 1.12.2模组开发3D盔甲 Minecraft 1.18.2模组开发3D动画盔甲 我们本次在1.19.2的版本中实现具有动画效果的3D盔甲 效果演示效果演示效果演示 1.首先&#xff0c;为了实现这些效果&#xff0c;我们需要首先使用到一个模组:geckolib…

剖析栈和队列OJ题

1.括号匹配问题给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。有效字符串需满足&#xff1a;1.左括号必须用相同类型的右括号闭合。2.左括号必须以正确的顺序闭合。3.每个右括号都有一个对应…

【阅读笔记】c++ Primer Plus——第八章

函数探幽 c内联函数 为了提高程序运行速度而做的改进编译的最终产物是可执行程序——由一组机器语言指令组成。运行程序时&#xff0c;操作系统将这些指令载入到计算机内存中&#xff0c;因此每条指令都有特定的内存地址。然后计算机开始逐步执行指令。执行到函数调用的时候&…

一道编程劝退题,检测你是否适合干编程

前言大家都知道要想成为一名优秀的开发工程师&#xff0c;需要数学基础好&#xff0c;即你要有很强的逻辑思维能力&#xff0c;这里有一道美国斯坦福大学出的一道逻辑思维的测试测试&#xff0c;检测你的逻辑思维能力&#xff0c;大家可以看看自己逻辑能力怎么样。题目有一个抽…

<队列>的概念结构实现【C语言版】

1.队列的概念及结构 队列对于临时数据的处理也十分有趣&#xff0c;它跟栈一样都是有约束条件的数组&#xff08;或者链表&#xff09;。区别在于我们想要按什么顺序去处理数据&#xff0c;而这个顺序当然是要取决于具体的应用场景。 你可以将队列想象成是电影院排队。排在最…

Android Studio 工程导入 AOSP编译的 android.jar

使用场景   1.需要使用 framework 中的 SystemApi 文件或者 hide 的 API 接口   2.定制 Framework 层业务&#xff0c;即有 客制化 的 API 接口 补充知识点   1.framework 源码即 AS 工程目录中 External Libraries 下的 < Android API xx Platform > 下的原生 SDK…

Docker-全面详解(学习总结---从入门到深化)

一、什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 什么是"集装箱技术" 我们都知道码头里的集装箱是运载货物用的&#xff0c;它是一种按规格标准 化的钢制箱子。集装箱的特色&#xff0c;在于其格式划一&…

峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?

小游戏《羊了个羊》 短短的7天内&#xff0c;DAU突破了1亿、吞吐量峰值21WQps。 《羊了个羊》运营后台数据显示&#xff0c;在短短的7天内&#xff0c;这款小游戏的DAU就突破了1亿。 要知道&#xff0c;除了王者荣耀、原神等屈指可数的现象级手游之外&#xff0c;1亿DAU是这个…

LeetCode刷题模版:131 - 140

目录 简介131. 分割回文串132. 分割回文串 II133. 克隆图134. 加油站135. 分发糖果136. 只出现一次的数字137. 只出现一次的数字 II138. 复制带随机指针的链表139. 单词拆分140. 单词拆分 II【未理解】结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您…

【GitHub仓库上传和克隆】

GitHub仓库上传和克隆1. 安装1.1 WindowR:cmd1.2 选择写代码的文件夹右键Git Bash Here1.3 分支管理2. 本地仓库推送给网络仓库2.1 忽略推送文件2.2 本地初始推送3. 克隆3.1 克隆下载3.2 克隆代码修改上传3.2.1 初次推送3.2. 2 后续推送其他1. 安装 1.1 WindowR:cmd //是否安…

Redis从入门到精通(一:Redis入门)

Redis 简介 问题现象 海量用户 高并发 罪魁祸首——关系型数据库性能瓶颈&#xff1a;磁盘IO性能低下扩展瓶颈&#xff1a;数据关系复杂&#xff0c;扩展性差&#xff0c;不便于大规模集群解决思路降低磁盘IO次数&#xff0c;越低越好 —— 内存存储去除数据间关系&#xff0…

ucore lab1,lab2,lab3,lab4链表详解 获取结构体成员偏移

ucore版链表介绍 ucore是清华大学操作系统实验课要完成的操作系统&#xff0c;里面有个链表数据结构我觉得很有意思&#xff0c;记录下来。 ucore将链表与数据对象分离&#xff0c;使得任意数据对象&#xff0c;只要加上一个链表组件就能组织成一个链表。 要使得一个本来不具…

双目相机国产、非国产统计参数对比分析

双目相机国产、非国产统计参数对比分析 ZED ZED是STEREOLABS出品的双目摄像头&#xff0c;广泛应用在科研机构的无人车、协作机械臂上&#xff0c;如图2-1所示。其3D分辨率在Ultra模式下可达到RGB时的分辨率&#xff0c;具体见图2-2&#xff0c;物理尺寸为1753033mm&#xff…