iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详解Vue适时清理keepalive缓存方案
  • 292
分享到

详解Vue适时清理keepalive缓存方案

2024-04-02 19:04:59 292人浏览 薄情痞子
摘要

目录需求思考尝试1. 手动操作 keep-alive 组件的 cache 数组2. exclude 大法好Demo需求 单页面应用中,用户进入表单填写页面,需要初始化表单内容,填写过

需求

单页面应用中,用户进入表单填写页面,需要初始化表单内容,填写过程中可能涉及到地图选点或者列表选择等操作,需要到新的页面选择并回调显示。

此时我们需要缓存表单填写页面实例,当退出表单填写或提交完表单内容之后,需要销毁当前表单实例,下次进入重新进行初始化

思考

说到 Vue 缓存,我们肯定首先选择官方提供的缓存方案 keep-alive 内置组件来实现。

keep-alive 组件提供给我们缓存组件的能力,可以完整的保存当前组件的状态,这帮了我们很大的忙

但实际业务场景中,我们很多时候是按需缓存页面的,就像 App 开发那样,每个页面都是单独的一个页面实例,由于 Vue Router 的限制,每个页面有固定的一个 path,所以导致每次访问这个 path 都会命中同一个组件实例

这个时候可能会有小伙伴说

诶,不是可以用 activated 来进行页面更新或者处理吗?

没错,是可以这样,但是,有些操作是 mounted 里面要做,有些需要放到 activated 里面更新,代码要处理很多进入页面的操作,就很麻烦啊。

此时就有两个思考方向:

  • 在必要的时候清除掉缓存页面的实例
  • 每次 push 页面的时候,保证当前页面是全新的实例对象,和 App 页面栈相同

第二种方案可以比较物理的解决需求中的问题,但是需要改动的地方很多,比如 Vue Router 中路由切换的时候,是否采用动态生成 path ,确保当前页面实例不唯一,而且我们也要做好自己的页面栈管理,类似于 iOS 中的 UINavigationController ,以便于及时清理栈中缓存的页面实例

因为改动比较大,而且需要大量测试,所以最后还是选择在方案一的方向进行探索和尝试。

尝试

1. 手动操作 keep-alive 组件的 cache 数组

//  Vue 2 keep-alive 部分源码片段
const { cache, keys } = this;
const key: ?string =
    vnode.key == null
        ? // same constructor may get reGIStered as different local components
          // so cid alone is not enough (#3269)
          componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : "")
        : vnode.key;
if (cache[key]) {
    vnode.componentInstance = cache[key].componentInstance;
    // make current key freshest
    remove(keys, key);
    keys.push(key);
} else {
    // delay setting the cache until update
    this.vnodeToCache = vnode;
    this.keyToCache = key;
}

通过路由守卫在特定的情况下删除 cache 数组中的页面实例,同时 destory 当前实例

removeKeepAliveCacheForVueInstance(vueInstance) {
    let key =
        vueInstance.$vnode.key ??
        vueInstance.$vnode.componentOptions.Ctor.cid + (vueInstance.$vnode.componentOptions.tag ? `::${vueInstance.$vnode.componentOptions.tag}` : "");
    let cache = vueInstance.$vnode.parent.componentInstance.cache;
    let keys = vueInstance.$vnode.parent.componentInstance.keys;
    if (cache[key]) {
        vueInstance.$destroy();
        delete cache[key];
        let index = keys.indexOf(key);
        if (index > -1) {
            keys.splice(index, 1);
        }
    }
}

这种方案比较繁琐,但由于是直接操作 cache 数组,可能会产生一些预期外的泄漏问题或者运行问题,虽然我自己尝试的时候没有发现。。

Vue 3 中我也尝试去寻找对应的 cache 数组,还真被我找到了,但是 Vue 3 源码中对于 cache 数组的操作权限仅限于开发环境

// Vue 3 KeepAlive 组件片段
if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) {
    ;(instance as any).__v_cache = cache
}

部署生产环境之后就没办法通过 instance.__v_cache 来获取 cache 数组了,所以这种方案到 Vue 3 就没办法进行下去啦。

于是乎,就有了第二个尝试

2. exclude 大法好

之前接触 keep-alive 所有注意力都放在 include 这个属性上面,其实 exclude 属性同样重要,而且效果和我们直接删除 cache 数组异曲同工。

// Vue 3 KeepAlive 组件片段
 if (
    (include && (!name || !matches(include, name))) ||
    (exclude && name && matches(exclude, name))
    ) {
        current = vnode
        return rawVNode
    }

如果 exclude 里面有值,那么就返回当前新的实例不从 cache 里面获取。而且 exclude 的优先级是高于 include 的。

利用这一点,我们就可以通过操作 exclude 中的内容,来达到控制缓存页面的效果。

而且 excludeVue 3 中的控制更为方便,只需要定义一个全局的 exclude 响应式变量就可以随处操作了,清除的具体方式取决于业务流程

export const excludes = ref<string[]>([]);
// 需要删除的时候
export function removeKeepAliveCache(name: string) {
    excludes.value.push(name);
}
// 需要恢复缓存的时候
export function reseTKEepAliveCache(name: string) {
    excludes.value = excludes.value.filter((item) => item !== name);
}

Demo

这里提供一个小 demo 演示一下缓存清除效果:

https://ztstory.GitHub.io/vue-composition-demo/#/

流程:

  • IndexInput 为缓存页面

  • Input 返回到 Index 时清除 Input 缓存,重新进入 Input 页面激活缓存

Demo 源码地址:Https://github.com/ZTStory/vue-composition-demo

到此这篇关于详解Vue适时清理keepalive缓存方案的文章就介绍到这了,更多相关Vue清理keepalive缓存内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Vue适时清理keepalive缓存方案

本文链接: https://www.lsjlt.com/news/153457.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Vue适时清理keepalive缓存方案
    目录需求思考尝试1. 手动操作 keep-alive 组件的 cache 数组2. exclude 大法好Demo需求 单页面应用中,用户进入表单填写页面,需要初始化表单内容,填写过...
    99+
    2024-04-02
  • vue keepAlive缓存清除问题案例详解
    vue项目中经常会用到keepalive来做缓存,在应付基本要求上可以说非常方便。但是遇到同一个页面,根据条件不同,分别缓存或者不缓存,就有些麻烦了。 首先先把坑列出来: 1. ...
    99+
    2024-04-02
  • React中实现keepalive组件缓存效果的方法详解
    目录背景结构代码背景 由于react官方并没有提供缓存组件相关的api(类似vue中的keepalive),在某些场景,会使得页面交互性变的很差,比如在有搜索条件的表格页面,点击某一...
    99+
    2023-01-14
    React keepalive组件缓存效果 React keepalive组件缓存 React keepalive缓存 React keepalive
  • 详解SpringBoot2.0的@Cacheable(Redis)缓存失效时间解决方案
    问题   @Cacheable注解不支持配置过期时间,所有需要通过配置CacheManneg来配置默认的过期时间和针对每个类或者是方法进行缓存失效时间配置。 解决 ...
    99+
    2024-04-02
  • 阿里云清理服务器内缓存方法详解
    在使用阿里云服务器的过程中,我们可能会遇到服务器运行缓慢、内存占用高等问题。其中,服务器内缓存的清理是一个重要的步骤,能够有效提高服务器的运行效率。那么,阿里云清理服务器内缓存的具体方法是什么呢?本文将详细介绍。 一、阿里云清理服务器内缓存...
    99+
    2023-11-17
    阿里 缓存 详解
  • vue发布后不清理缓存怎么解决
    今天小编给大家分享一下vue发布后不清理缓存怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Vue.js 是一款流行的...
    99+
    2023-07-06
  • Vue的缓存方法示例详解
    最近新做了个需求“前端缓存” 需求背景:解决表单高频率重复填报问题,要求打开页面自动填充上次录入的数据,数据存储期限为一周(7天有效期)。 说起缓存首先想到的则是 localstor...
    99+
    2024-04-02
  • PHP数据缓存和清理函数详解:memcache、Redis、APC等函数的数据缓存和清理管理方法
    PHP数据缓存和清理函数详解:memcache、Redis、APC等函数的数据缓存和清理管理方法引言:在PHP开发中,数据缓存和清理是非常重要的一部分。合理地使用缓存可以提升网站性能,而清理管理功能可以帮助我们及时释放占用的内存资源。本文将...
    99+
    2023-11-18
    PHP 缓存管理 数据清理
  • 详解vue computed的缓存实现原理
    目录初始化 computed依赖收集派发更新总结一下本文围绕下面这个例子,讲解一下computed初始化及更新时的流程,来看看计算属性是怎么实现的缓存,及依赖是怎么被收集的。 &...
    99+
    2024-04-02
  • 详解缓存穿透击穿雪崩解决方案
    目录一:前言二:缓存穿透三:解决方案四:缓存雪崩五:解决方案六:缓存击穿七:解决方案1、使用互斥锁(mutexkey)2、"提前"使用互斥锁(mutexkey)3、"永远不过期"4、...
    99+
    2024-04-02
  • redis实现多级缓存同步方案详解
    目录前言多级缓存数据同步如何使用Redis6客户端缓存总结前言 前阵子参加业务部门的技术方案评审,故事的背景是这样:业务部门上线一个专为公司高管使用的系统。这个系统技术架构形如下图 按理来说这个系统因为受众很小,可以说...
    99+
    2022-12-21
    redis多级缓存同步 redis多级缓存 redis缓存同步
  • 详解Redis缓存穿透/击穿/雪崩原理及其解决方案
    目录1. 简介2. 缓存穿透2.1描述2.2 解决方案3. 缓存击穿3.1 描述3.2 解决方案4. 缓存雪崩4.1 描述4.1 解决方案5. 布隆过滤器5.1 描述5.2 数据结构...
    99+
    2024-04-02
  • 阿里云服务器卡缓存的清除方法详解
    阿里云服务器是一种高度可靠的云计算服务,它能为用户提供快速、安全的数据存储和处理能力。然而,有时在使用阿里云服务器的过程中,可能会遇到卡缓存的问题,影响服务器的运行效率。本文将详细介绍如何清除阿里云服务器卡缓存的方法。 阿里云服务器卡缓存的...
    99+
    2023-11-17
    阿里 缓存 详解
  • vue中清除定时器的方法实例详解
    目录一、问题二、问题出现的原因三、问题解决思路四、实现的源代码五、总结一、问题 1、在vue中使用setTimeout定时器的时候,可能会遇到关不掉的情况,会存在明明已经在befor...
    99+
    2023-02-07
    vue清除定时器方法 设置定时器和清除定时器 vue 定时
  • SQLServer清理日志文件方法案例详解
    很多时候SQLSERVER的日志文件是不看的,但时间久了,够把磁盘撑爆,这时候就需要清理日志文件。使用以下方法,在实际环境中经过测试,400G的日志文件1秒就被清理。 操作步骤 1....
    99+
    2024-04-02
  • Springboot详解缓存redis实现定时过期方法
    目录前言添加依赖添加配置常规缓存开启缓存设置缓存空间设置缓存增加设置缓存过期时间总结后记前言 使用redis进行缓存数据,是目前比较常用的缓存解决方案。常用的缓存形式有一下几种: 1...
    99+
    2024-04-02
  • 选择适合你项目的最佳缓存解决方案:Python常用的缓存库和工具
    Python中常用的缓存库和工具:选择适合你项目的最佳方案,需要具体代码示例 引言:在开发Python项目时,为了提高程序的性能和响应速度,常常会使用缓存来存储计算结果或者频繁读取的数据。使用缓存可以减少对底层数据库或其他外部依...
    99+
    2024-01-23
    TTLCache
  • vue使用keep-alive进行组件缓存方法详解(组件不缓存问题解决)
    目录一、使用场景二、 认识下keep-alive三、在组件中应用四、解决组件不缓存问题五、keep-alive配合router使用总结一、使用场景 在vue开发过程中(单页面),有一...
    99+
    2024-04-02
  • Vue页面级缓存解决方案feb-alive的示例分析
    这篇文章主要介绍Vue页面级缓存解决方案feb-alive的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!feb-aliveVue页面级缓存解决方案feb-alive (上)...
    99+
    2024-04-02
  • vue储存storage时含有布尔值的解决方案
    vue储存storage时含有布尔值 今天遇到一个问题,需要将后台返回的true和false存到storage中去,然后用储存的这个值进行逻辑判断,但是一直判断都是错误的,后面查阅了...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作