① vue3使用 keep-alive对iframe进行缓存
使用keep-alive缓存不了iframe界面原因
【1】原理:Vue 的缓存机制并不是直接存储 DOM 结构,而是将 DOM 节点抽象成了一个个 VNode节点。因此,Vue 的 keep-alive 缓存也是基于 VNode节点 而不是直接存储 DOM 节点。在需要渲染的时候从Vnode渲染到真实DOM上。
【2】参数:Keep-alive 组件提供了 include 和 exclude 两个属性,允许组件有条件的进行缓存。
include: 字符串或正则表达式。只有匹配的组件会被缓存。
exclude: 字符串或正则表达式。任何匹配的组件都不会被缓存。
【3】Keep-alive 组件提供了两个生命钩子函数,分别是 activated 和 deactivated 。
activated :当页面存在缓存的时候执行该函数。
deactivated :在页面结束时触发该方法,可清除掉滚动方法等缓存。
iframe页里的内容并不属于节点的信息,所以使用keep-alive依然会重新渲染iframe内的内容。而且iframe每一次渲染就相当于打开一个新的网页窗口,即使把节点保存下来,在渲染时iframe页还是刷新的。
不使用 keep-alive ,因为vnode原理不适用。直接把打开过得iframe中的dom保存下来。通过v-show显示隐藏
iframeComponentsArray这个数组是打开过的iframe页面数组
② 解决vue keepAlive 二次进入页面显示首次缓存问题
问题场景: 当某个带有筛选条件查询列表的页面需要进行缓存,以便不再需要重复进行选择或者输入筛选条件的时候,我们就可以利用keepAlive来进行缓存,但keepAlive也存在着一些坑,这是需要注意的地方。
如何利用keepAlive进行缓存
1、在路由meta内定义keepAlive,来设置需要被缓存的页面
meta: { keepAlive: true }
ture: 需要缓存的路由;false:不需要缓存的路由
2、判断router-view
被keep-alive包裹的为需要缓存的页面,这样我们就可以通过keepAlive来切换哪些页面需要缓存,哪些不需要缓存。
3、进入详情页面缓存,否则不缓存
路由守卫钩子 beforeRouteLeave 离开页面路由的时候出发; 当离开缓存页面,进入详情页面的时候,我们将缓存页面keepAlive设置true,如果离开缓存页面,不是进入详情页面的时候,我们设置为false,不进行缓存。
这是最基本的缓存设置,但是keepAlive也留下了一个大坑。
keepAlive二次进入页面显示首次缓存问题
第一次从缓存页面进入详情页再返回到缓存页面的时候,页面条件能被正确的缓存下来,但是当我们切换到别的路由,再一次进入该缓存页修改查询条件,并进入详情后返回缓存页,此时缓存的是页面状态是第一次进入该页面的时候的状态,也就是说,第二次进入页面的时候,该缓存读取的是第一次的缓存,这就非常的坑了。 所以通过下面的刷新缓存路由的方式来解决这个问题。
1、调整 router-view
定义一个isRouterAlive变量,用来刷新keep-alive;通过provide向下面子孙组件们暴露一个reload方法,用来刷新缓存。
2、设置缓存
子组件注册inject: ['reload'] 方法,beforeRouteEnter钩子在进入缓存页面的时候通过通过判断路由是否是来自详情页面,如果不是详情页,我们就刷新缓存,如果是详情页,就不做处理。 这样就解决了,只要是路由进入过别的页面(非详情页面),我们就刷新缓存,这样就不会出现二次进入的时候,显示的是第一次的缓存状态,同时从详情页返回后正常显示缓存数据。
③ 退出登录后清除keepalive缓存
最近项目中被一个keep-alive的问题困扰了很久,项目中有四个页面使用了keep-alive,导致用户退出登录后,使用其他账号登录时,还保存着前一个用户的信息,经历了一系列的暴力删除无效后,最终采用了以下方法,用户退出登陆后移除keep-alive:
参考了:
https://stackoverflow.com/questions/48661595/how-to-destroy-a-vuejs-component-that-is-being-cached-by-keep-alive
https://zhuanlan.hu.com/p/40374425
④ vue页面缓存,keep-alive第一次无效的解决方法
方法二:使用 include + beforeRouteLeave + vuex 与方法一相似,不同的地方在于,将需要缓存的组件保存到全局变量,可以在路由的钩子函数里灵活的控制哪些组件需要缓存,那些不需要缓存;跟方法一相比,不需要每次再重新初始化数据,但是需要在vuex中保存数据;
1、在创建router实例的时候加上scrollBehavior方法
2、将需要缓存的组件加在include属性里
3、在store里加入需要缓存的的组件的变量名,和相应的方法;
4、在beforeRouteLeave钩子函数里控制需要缓存的组件
⑤ 如何清除缓存属性 keepalive vue
一般手机运行内存不足,或手机内存,手机存储空间不足的时候,手机都会出现这种提示的哦!
解决方法:
1.进入设置--存储——首选安装位置——选择用户空间(手机存储)。
2.把安装在系统空间的程序移动到用户空间中,设置——程序管理(或应用程序)——全部——点击程序—移动至用户空间(手机存储)。
3.做完以上操作之后建议你可以定期给手机清理下缓存,从而为手机释放一些空间,
3.也可以尽量卸载一些不必要的软件,以免占用手机内存。一次不要运行过多程序的,运行程序过多,运行内存可以不足的。
4.清理缓存的操作----长按关机键10秒直至进入完全关机状态,然后同时按住电源键跟音量减键,进入工程模式,通过音量键选择清理缓存选项,电源键确定,系统将自动清理缓存哦