网站首页 > 技术文章 正文
项目背景
项目采用的若依框架,但系统中会嵌入大屏、报表页面,是使用iframe来实现的。
若依框架的菜单管理中提供了缓存功能,是使用keep-alive实现的,但对于iframe页面并不生效,由于大屏页面加载本来就较慢,当用户切换tab页时,iframe要重载并且无法记录之前的操作内容,这非常影响用户体验。
keep-alive
keep-alive的缓存原理,其实是缓存的vnode,它的本质就是js对象,是一串数据,而对于iframe,缓存到的只有一个url,无法知悉其内部的结构与数据,因此无法进行缓存。
解决思路
绕开路由管理,在最外层文件(App.vue)中实现iframe动态加载,并搭配v-show控制iframe显示/隐藏。相当于通过定位,将一个独立的iframe页面覆盖在原有页面的最上方,
具体实现
- 配置菜单时,将含有iframe的页面多加一个配置参数 isIframe:true,用于前端区分
- store中存储:缓存的iframe信息{path,url}数组,菜单栏状态(根据菜单展开折叠状态来确定iframe的宽度)
Bash
const useIframesStore = defineStore(
'iframes',
{
state: () => ({
cacheIframes: [],
}),
actions: {
addIframe(iframe) {
this.cacheIframes.push(iframe)
},
delIframe(path) {
this.cacheIframes = this.cacheIframes.filter(item => item.path !== path)
},
clearCache() {
this.cacheIframes = []
}
}
}
)
- App.vue:v-for加载store中的已缓存的iframe信息,v-show的控制条件为比对当前路由的path于iframe的path是否一致。
- 样式问题:因为iframe组件不在router-view内,那么它和菜单是毫无关联的,需要独立设置其样式;为了正常显示效果,采用绝对定位的方式将它悬浮在正常页面的位置;width需要根据store中存储的菜单状态去显示对应的宽度
Bash
<template>
<router-view/>
<!-- iframe页 -->
<div v-if="route.path!=='/login'" :class="`iframes w-menu${sidebar.opened?'1':'0'}`" :style="`height:${iframeHeight};z-index:${route.query.isIframe?'999':'-999'}`">
<Iframe v-for="i in cacheIframes" :key="i.path" :src="i.url" v-show="route.path === i.path" title="iframe"></Iframe>
</div>
</template>
...
<style lang="scss" scoped>
.w-menu1{
width: calc(100% - #{$base-sidebar-width});
}
.w-menu0{
width: calc(100% - 54px);
}
</style>
- 路由守卫beforeEach:跳转路由时,根据路由参数isIframe为true时,表示即将跳转到iframe页面,调用store的方法往iframe数组中添加iframe信息
router.beforeEach((to, from, next) => {
const iframesStore = useIframesStore();
// 跳转iframe页
if(to.query.isIframe){
if(iframesStore.cacheIframes.filter(item => item.path === to.path).length==0){
// 添加缓存
iframesStore.addIframe({
path: to.path,
url: to.query.iframeUrl
})
}
}
next();
})
- 关闭tab签时:删除store中对应的iframe项
function closeSelectedTag(view) {
if(view.query.isIframe){
iframesStore.delIframe(view.path);
}
...
}
- 用户退出登录后,清空缓存
...
logOut() {
return new Promise((resolve, reject) => {
logout(this.token).then(() => {
this.token = ''
this.roles = []
this.permissions = []
removeToken()
// 清空缓存
useIframesStore().clearCache()
resolve()
}).catch(error => {
reject(error)
})
})
}
- 在若依菜单管理中将iframe页面,使用参数isIframe控制,而对应的组件页面设置为一个空白页,以避免同时加载两个iframe占用资源。
- 上一篇: 什么是 CDN 缓存命中率以及如何计算和优化它?
- 下一篇: 系统设计 | 缓存系统设计
猜你喜欢
- 2025-01-12 CDN+OpenResty 实现丝滑访问的登录态缓存站
- 2025-01-12 如何在Spring Boot中通过布隆过滤器防止缓存穿透问题?
- 2025-01-12 HTML5缓存机制浅析:移动端Web加载性能优化
- 2025-01-12 如何在 NGINX 中缓存内容
- 2025-01-12 如何解决服务器缓存过高
- 2025-01-12 白帽黑客贡献新的Web攻击方式,CDN缓存服务器成为数据泄露目标
- 2025-01-12 西部数据推出新款蓝盘机械硬盘:CMR技术,4TB 549元
- 2025-01-12 面试官:如何实现多级缓存?
- 2025-01-12 基于spring boot的注解缓存,自带轻量级缓存管理系统
- 2025-01-12 系统设计 | 缓存系统设计
你 发表评论:
欢迎- 530℃Oracle分析函数之Lag和Lead()使用
- 527℃几个Oracle空值处理函数 oracle处理null值的函数
- 526℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 513℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 510℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 501℃【数据统计分析】详解Oracle分组函数之CUBE
- 480℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 478℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端排序 (47)
- 前端定时器 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)