Vue iframe嵌套的页面实现路由缓存 实现keep-alive效果

本地页面用keep-alive路由缓存显示,iframe的页面用v-show显示

复制代码
<template>
  <section class="app-main">
    <component
      :key="item.name"
      :style="{ height: height, minHeight: height }"
      v-show="item.meta.externalUrl.indexOf($route.path) > -1"
      v-for="item in hasOpenComponentsArr"
      :is="item.component"
    >
    </component>
    <keep-alive :include="cachedViews">
      <router-view
        :key="key"
        :style="{ height: height, minHeight: height }"
        v-show="handleShow(key)"
      />
    </keep-alive>
  </section>
</template>

<script>
import { mapGetters } from "vuex";
import Vue from "vue/dist/vue.js";
export default {
  name: "AppMain",
  created() {
    // 设置iframe页的数组对象
    const componentsArr = this.getComponentsArr();
    componentsArr.forEach((item) => {
      Vue.component(item.name, item.component);
    });
    this.componentsArr = componentsArr;
    // 判断当前路由是否iframe页
    this.isOpenIframePage();
    // this.isNowFunc();
    this.$bus.$on("closePage", () => {
      this.isOpenIframePage();
    });
  },
  data() {
    return {
      height: "calc(100vh - 93px)",
      componentsArr: [], // 含有iframe的页面
    };
  },
  computed: {
    ...mapGetters(["sidebarRouters"]),
    cachedViews() {
      return this.$store.state.tagsView.cachedViews;
    },
    key() {
      return this.$route.path;
    },
    // 实现懒加载,只渲染已经打开过(hasOpen:true)的iframe页
    hasOpenComponentsArr() {
      return this.componentsArr.filter((item) => item.hasOpen);
    },
    visitedViews() {
      return this.$store.state.tagsView.visitedViews;
    },
  },
  watch: {
    $route: {
      handler(val) {
        this.isOpenIframePage();
      },
      immediate: true,
    },
  },
  methods: {
    // 不渲染包含iframe的路由
    handleShow(key) {
      var flag = true;
      var index = this.componentsArr.findIndex(
        (v) => v.meta.externalUrl.indexOf(key) > -1
      );
      if (index != -1) {
        flag = false;
      }
      return flag;
    },
    // 根据当前路由设置hasOpen
    isOpenIframePage() {
      var index = this.componentsArr.findIndex((item) => {
        return item.meta.externalUrl.indexOf(this.$route.path) > -1;
      });
      if (index != -1) {
        this.componentsArr[index].hasOpen = true;
      }
      if (this.visitedViews.length > 0) {
        this.componentsArr.forEach((item, itemIndex) => {
          var index = this.visitedViews.findIndex(
            (v) => item.meta.externalUrl.indexOf(v.fullPath) > -1
          );
          if (index == -1) {
            this.componentsArr[itemIndex].hasOpen = false;
          }
        });
      }
    },
    // 遍历路由的所有页面,把含有iframeComponent标识的收集起来
    getComponentsArr() {
      const routes = this.sidebarRouters;
      const iframeArr = [];
      routes.filter((items) => {
        if (items.children) {
          items.children.forEach((item) => {
            if (item.meta && item.meta.externalUrl) {
              iframeArr.push({
                ...item,
                hasOpen: false,
                component: () => import("@/views/iframe/index"),
              });
            }
          });
        }
      });
      return iframeArr;
    },
  },
};
</script>

<style lang="scss" scoped>
.app-main {
  overflow: auto;
  width: 100%;
  position: relative;
  overflow: hidden;
}
</style>
相关推荐
一袋米扛几楼989 分钟前
【Git】规范化协作:详解 GitHub 工作流中的 Issue、Branch 与 Pull Request 最佳实践
前端·git·github·issue
网络点点滴22 分钟前
前端与后端的区别与联系
前端
EnCi Zheng1 小时前
M5-markconv自定义CSS样式指南 [特殊字符]
前端·css·python
kyriewen1 小时前
你的网页慢,用户不说直接走——前端性能监控教你“读心术”
前端·性能优化·监控
广州华水科技1 小时前
北斗GNSS变形监测在大坝安全监测中的应用与优势分析
前端
前端老石人1 小时前
前端开发中的 URL 完全指南
开发语言·前端·javascript·css·html
CAE虚拟与现实1 小时前
五一假期闲来无事,来个前段、后端的说明吧
前端·后端·vtk·three.js·前后端
Sarvartha1 小时前
三目运算符
linux·服务器·前端
晓晨的博客1 小时前
ROS1录制的bag包转换为ROS2格式
前端·chrome
Wect1 小时前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·typescript