1.简介 关于iframe标签一般用于项目内外嵌页面。比如vue中经常会遇到外嵌页面的问题,但是有需求这样的 要求外嵌页面的内容保持缓存 项目中一不小心点他其它页面 再次切换回来 防止页面外嵌页面再次刷新。

2关于使用keep-alive缓存不了iframe界面原因
很多人第一想法就是会使用 keep-alive 去实现组件缓存,但是对iframe标签是行不通的,keepalive作为缓存组件这里不过多介绍,大多用于项目中 标签的嵌套 实现出口视图页面的缓存。项目中可以发现keepalive包裹的组件的确 只触发了一次生命周期,但是每次切换 iframe标签内嵌页面依旧会在浏览器中刷新。原因在于

1.Vue 的缓存机制并不是直接存储 DOM 结构,而是将 DOM 节点抽象成了一个个 VNode节点。因此,Vue 的 keep-alive 缓存也是基于 VNode节点 而不是直接存储 DOM 节点。在需要渲染的时候从Vnode渲染到真实DOM上。
2.iframe中keep-alive机制失效原因:iframe页里的内容并不属于节点的信息,所以使用keep-alive依然会重新渲染iframe内的内容。而且iframe每一次渲染就相当于打开一个新的网页窗口,即使把节点保存下来,在渲染时iframe页还是刷新的。

3解决方案
其实思路就很简单了,我们可以在切换不含iframe的界面时使用vue路由,在切换含iframe页的界面时利用v-show来控制显示隐藏,使iframe的节点不被删除,以此来防止界面节点被重新更新,从而达到保存iframe节点数据的效果。
简单点的实现方案就是你自己把单独需要用到iframe标签外嵌的页面 专门以组件的形式再模板页面中引入 与 出口一起同时渲染,并且根据路由的监听 控制它的显示隐藏,注意这里必须是v-show来控制,不能移除dom节点
一下是自己写的简单demo,仅供参考

<template>
  <section class="app-main">
    <transition name="fade-transform" mode="out-in">
      <!-- :include="cachedViews" -->
      <keep-alive>
        <router-view :key="key" v-if="status" />
      </keep-alive>
    </transition>
    <Hd v-show="this.$route.name === 'iframe'"></Hd>
  </section>
</template>

<script>
// import Vue from 'vue'
import Hd from '@/views/permission/ifarem'
export default {
  name: 'AppMain',
  components: {
    Hd
  },
  data () {
    return {
      componentsArr: [],
      status: true
    }
  },
  computed: {
    cachedViews () {
      return this.$store.state.tagsView.cachedViews
    },
    key () {
      return this.$route.path
    }
  },
  watch: {
    $route () {
      console.log(this.$route.name, '$route')
      if (this.$route.name == 'iframe') {
        this.status = false
      } else {
        this.status = true
      }
      // 判断当前路由是否iframe页
    }
  },

HD就是单独引入的iframe标签组件。方法很low,仅供实现效果。

Logo

前往低代码交流专区

更多推荐