vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > Vue iframe无法缓存

Vue无法对iframe进行缓存的解决方案

作者:夏葵

项目采用的若依框架,但系统中会嵌入大屏、报表页面,是使用iframe来实现的,若依框架的菜单管理中提供了缓存功能,是使用keep-alive实现的,但对于iframe页面并不生效,所以本文介绍了关于Vue无法对iframe进行缓存的解决方案记录,需要的朋友可以参考下

项目背景

项目采用的若依框架,但系统中会嵌入大屏、报表页面,是使用iframe来实现的。

若依框架的菜单管理中提供了缓存功能,是使用keep-alive实现的,但对于iframe页面并不生效,由于大屏页面加载本来就较慢,当用户切换tab页时,iframe要重载并且无法记录之前的操作内容,这非常影响用户体验。

keep-alive

keep-alive的缓存原理,其实是缓存的vnode,它的本质就是js对象,是一串数据,而对于iframe,缓存到的只有一个url,无法知悉其内部的结构与数据,因此无法进行缓存。

解决思路

绕开路由管理,在最外层文件(App.vue)中实现iframe动态加载,并搭配v-show控制iframe显示/隐藏。相当于通过定位,将一个独立的iframe页面覆盖在原有页面的最上方,

具体实现

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 = []
        }
      }
    }
)
<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>
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();
})
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)
      })
    })
}

到此这篇关于Vue无法对iframe进行缓存的解决方案的文章就介绍到这了,更多相关Vue iframe无法缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文