首页 > 其他分享 >使用keepalive针对页面缓存的一些问题的解决方法

使用keepalive针对页面缓存的一些问题的解决方法

时间:2023-11-30 16:05:27浏览次数:33  
标签:vue 生命周期 keepalive 缓存 组件 页面 keepAlive


场景介绍

在项目前端设计中有一个需求,需要跳转到其他页面先拿到数据,再返回到原界面,但是原界面填写的数据会被刷新,因此在这个地方需要对页面的数据进行缓存

需求分析

项目使用的是Vue3,对于页面缓存,在网上搜索后锁定了 keepAlive 做缓存

简介

keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。 和 transition 相似,keep-alive 是一个抽象组件:它自身不会渲染成一个 DOM 元素,也不会出现在父组件链中。

作用: 在组件切换过程中将状态保留在内存中,防止重复渲染DOM,减少加载时间及性能消耗,提高用户体验性。

原理: 在 created 函数调用时将需要缓存的 VNode 节点保存在 this.cache 中/在 render(页面渲染) 时,如果 VNode 的 name 符合缓存条件(可以用 include 以及 exclude 控制),则会从 this.cache 中取出之前缓存的 VNode 实例进行渲染。 (VNode:虚拟DOM,其实就是一个JS对象)

使用

参数

参数名


描述

include

字符串或正则表达式

只有名称匹配的组件会被缓存。

exclude

字符串或正则表达式

任何名称匹配的组件都不会被缓存。

max

数字

最多可以缓存多少组件实例。

配置App.vue vue2.x与vue3.0的App.vue配置有差异,在App.vue配置信息如下: vue2.x中,router-view可整个放入keepalive中,如下:

<template>
	<!-- vue2.x配置 -->
   <keep-alive>
    <router-view v-if="$route.meta.keepAlive" />
  </keep-alive>
  <router-view v-if="!$route.meta.keepAlive"/>
</template>

vue3.0的App.vue配置方法如下:

<template>
  <!-- vue3.0配置 -->
  <router-view v-slot="{ Component }">
    <keep-alive>
      <component :is="Component"  v-if="$route.meta.keepAlive"/>
    </keep-alive>
    <component :is="Component"  v-if="!$route.meta.keepAlive"/>
  </router-view> 
</template>


添加meta属性,针对需要缓存的页面,将keepAlive属性设置为true,否则为false


实现页面部分刷新 先了解vue的生命周期,被keepAlive包裹的组件和页面,页面进入时执行的生命周期为:created->mounted->activated; 其中created->mounted是页面第一次进入才会执行,activated生命周期在页面每次进入都会执行,特属于keepAlive的一个生命周期,所以我们把页面每次进来要进行的操作放入该生命周期即可。 如下代码:

activated() {
	//---代码块---//
},


实现的功能是用户每次进入将动态验证码设为空,实现此功能也可以用其他方式,比如说将该组件放缓存外(参见2、component配置缓存)。

4)动态设置路由keepAlive属性 有些时候我们用完了keepalive缓存之后,想让页面不再保持缓存,或者设置下一个页面keepalive,也这个时候我们可以改变meta的keepAlive值来去除页面缓存,使用beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave,使用方式如下:

// to为即将跳转的路由,from为上一个页面路由
beforeRouteLeave(to, from,+ next) {
    // 设置下一个路由的 meta
    to.meta.keepAlive = false;
    next();
}


详细情况可以参考(https://blog.csdn.net/m0_46309087/article/details/109403655)

对于钩子函数onActivated,详细可以参考(https://blog.csdn.net/m0_64494670/article/details/128597109)

注:

关于Vue+Vite项目打包dist文件后使用Hbuilder的5+APP进行APK文件封装后无法显示页面的问题解决方法:

在项目根目录下默认生成的vite.config.js文件当中添加base:'./'


标签:vue,生命周期,keepalive,缓存,组件,页面,keepAlive
From: https://blog.51cto.com/u_16397236/8631715

相关文章

  • Vue 项目配置自动更新,自动刷新页面
    今天用户反馈使用页面的时候,有时候点击没反应,排查下来,是因为发布版本的时候,用户那边没有加载最新的文导致的,然后根据思路,做了这个自动更新的功能效果预览http://demo.webwlx.cn/#/update实现思路1.把当前版本的编译时间,通过环境变量的方式保存起来打开vite.config.jsim......
  • vue3页面中,两个相同组件,一个卸载,一个挂载,后展示的组件事件监听不生效?
    场景:在实际开发中,遇到了这样一种场景,vue3页面,两个相同组件,在满足某条件下展示第一个组件,满足另一个条件下,隐藏第一个组件,同时展示第二个组件,比如反馈组件,会通过window.addEventListener来监听自定义的反馈弹窗展示和隐藏事件。结果:两个相同组件一个卸载,一个挂载,第一个组监听的......
  • 在web-view加载的本地及远程HTML中调用uni的API及网页和vue页面通讯
    转载于在web-view加载的本地及远程HTML中调用uni的API及网页和vue页面通讯-DCloud问答uni-app的web-view组件,支持加载远程网页,在app环境下,还支持加载本地HTML页面。在web-view加载页面中,会涉及wx、plus、uni等对象的使用。在小程序下使用wx的api,需要引入微信提供的https......
  • 每日一练:通过广播信道实现跨页面通信
    利用广播通道实现标签页通信1.什么是广播通道广播通道是一种新的浏览器原生API,它可以让你在同源的标签页之间传递消息。这个API的目的是为了让开发者可以在不同的标签页之间共享数据,而不需要使用LocalStorage或者其他的存储方式。2.广播通道的使用2.1创建广播通道constchannel......
  • 2023-11-30 记录实用小案例 —— react监听页面返回时执行事件
    useEffect(()=>{consthandlePageBack=()=>{//此处写你想要触发的事件};//监听浏览器的popstate事件,即页面返回事件window.addEventListener('popstate',handlePageBack);//在组件卸载时移除事件监听return()=>{......
  • 【Azure Cache for Redis】Redis的导出页面无法配置Storage SAS时通过az cli来完成
    问题描述在AzureRedis的导出页面,突然不能配置StorageAccount的SAS作为授权方式。那么是否可以通过AZCLI或者是Powershell来实现SAS的配置呢? 问题解答可以的。使用  azredisexport 可以实现azredisexport--container--prefix[--auth-......
  • 【Azure Cache for Redis】Redis的导出页面无法配置Storage SAS时通过az cli来完成
    问题描述在AzureRedis的导出页面,突然不能配置StorageAccount的SAS作为授权方式。那么是否可以通过AZCLI或者是Powershell来实现SAS的配置呢? 问题解答可以的。使用  azredisexport 可以实现azredisexport--container--prefix[--auth-......
  • 【Azure Cache for Redis】Redis的导出页面无法配置Storage SAS时通过az cli来完成
    问题描述在AzureRedis的导出页面,突然不能配置StorageAccount的SAS作为授权方式。那么是否可以通过AZCLI或者是Powershell来实现SAS的配置呢? 问题解答可以的。使用  azredisexport可以实现azredisexport--container--prefix......
  • 页面静态化——Django中Template和Context模块的使用方法
    1.Template和Context的导入fromdjango.templateimportTemplate,Context2.生成静态页面——在后端调用模板语法生成HTML页面,并保存到指定路径 2.1我们想生成一个前端页面,代码如下后端视图层传入的对象:user_data=models.Userdata.objects.all()<html......
  • 如何在一个html页面中引入vue跟axios
    如果想在HTML页面中引入Vue和Axios,可以按照以下步骤进行操作1、首页新建一个html页面2、打开vue官网进行引入或者下载vue.min.js包进行本地引入3、下载axios包,如下图所示4、在js部分中写的如下图所示5、axios使用......