vue中含有iframe的页面如何避免路由切换时keep-alive不起作用

news2024/11/26 22:47:59

路由组件中使用keep-alive 其他组件会正常缓存 但是含有iframe的页面无法正常缓存,这个问题困扰了我很久,也成为了项目目前的一个瓶颈。突然有一天,我们的技术总监推荐给我一篇博文,真的是让我醍醐灌顶,虽然这个keep-alive的一个问题吧,但是我们可以通过其他方式进行规避。

我们换个方式 通过v-show的方式切换含有iframe的组件

在这里插入图片描述
在这里插入图片描述

<multi-tab-store-consumer> 这个组件大家不必纠结,这个是框架自带的一个组件,忽略就可以。

  1. 后端给的路由属性中添加一个menuType标识页面中是否有iframe,如果有的话使用一个空的组件代替。
  2. 使用v-show控制其他组件的显示(在加载组件的时候循环已经打开的组件,而不是循环所有的组件,来提高渲染效率)

这里使用computed去筛选已经打开的组件 (store.cacheList是目前已经打开的页面缓存信息)

<template>
  <router-view v-slot="{ Component, route }">
    <transition :name="transitionName" appear>
      <multi-tab-store-consumer>
        <component v-if="Component" :is="Component" :pageName="route.meta.title"></component>
        <slot v-else />
      </multi-tab-store-consumer>
    </transition>
  </router-view>
  <!--通过v-show的方式切换含有iframe的组件-->
  <div v-if="isPageAlive" v-show="isDcPath" style="height: 100%">
    <div
      style="height: 100%"
      v-for="item in hasOpenComponentsArr"
      v-show="$route.path === item.path"
      :key="item.name"
    >
      <component
        v-if="pageAliveObj[item.path]"
        :is="item.name"
        :pageName="item.meta.title"
      ></component>
    </div>
  </div>
</template>

<script lang="ts">
import {
  computed,
  defineAsyncComponent,
  defineComponent,
  nextTick,
  reactive,
  ref,
  toRefs,
  watch,
} from 'vue';
import { MultiTabStoreConsumer } from '@/components/multi-tab';
import { injectMenuState } from './use-menu-state';
import localStorage from '@/utils/local-storage';
import { injectMultiTabStore } from '@/components/multi-tab/multi-tab-store';
import emitter from '@/views/EMRClient/WardNurseStationUI/DoctorOrdersTreatement/components/eventBus';
import { useRoute } from 'vue-router';
import { SET_ACCESS_CHANGE_MENU } from '@/store/modules/user/actions';
import { useStore } from 'vuex';

/**
 * @Author: zpp
 * @description: 获取含有iframe的 组件 参考链接: https://blog.csdn.net/weixin_44490109/article/details/110191582
 * @return {*}
 */
function getIframe() {
  const allowRouters = localStorage.get('allowRouters');

  let iframeCom: any = {}; // 组件对象
  let iframeComArr: any = []; // 组件数组 用于页面中component渲染

  iframeCom['MultiTabStoreConsumer'] = MultiTabStoreConsumer;

  const getIframeCom = (routers: any) => {
    routers.forEach((item: any) => {
      if (item.meta.menuType === '0') {
        let AsyncCom = defineAsyncComponent(() => import(`@/views/` + item.iframe));
        iframeCom[item.name] = AsyncCom;
        iframeComArr.push({
          name: item.name,
          path: item.path,
          meta: item.meta,
        });
      }
      if (item.children && item.children.length > 0) {
        getIframeCom(item.children);
      }
    });
  };
  if (allowRouters) {
    getIframeCom(allowRouters);
  }

  return { iframeCom, iframeComArr };
}

const { iframeCom: myComponent, iframeComArr: myComponentArr }: any = getIframe();

export default defineComponent({
  name: 'CustomRouterView',
  setup() {
    const route = useRoute();
    const store = injectMultiTabStore();
    const menuState = injectMenuState();
    const store1 = useStore();

    const hasOpenComponentsArr = computed(() => {
      if (store) {
        // (store.cacheList是目前已经打开的页面缓存信息)
        let arr = store.cacheList.map((ele: any) => ele.path);
        let comArr = myComponentArr.filter((item: any) => {
          let loaction = arr.indexOf(item.path);
          return loaction > -1;
        });

        return comArr;
      } else {
        return [];
      }
    });

    interface PageAlive {
      [key: string]: boolean;
    }

    let pageData = reactive({
      pageAliveObj: {} as PageAlive,
      isPageAlive: true, // 控制所有组件的显示
      isDcPath: false,
    });

    myComponentArr.forEach((ele: any) => {
      pageData.pageAliveObj[ele.path] = true;
    });
    watch(
      () => route.fullPath,
      () => {
        let result = myComponentArr.find((element: any) => element.path === route.fullPath);

        pageData.isDcPath = result !== undefined ? true : false;
      },
      { immediate: true },
    );

    // 刷新所有的组件
    emitter.on('refreshAllTab', data => {
      pageData.isPageAlive = false;
      //store1.dispatch(`user/${SET_ACCESS_CHANGE_MENU}`, data);
      localStorage.set('changeMenu', data);
      nextTick(() => {
        pageData.isPageAlive = true;
      });
    });

    // 刷新某一个组件
    emitter.on('refreshOneTab', (data: any) => {
      pageData.pageAliveObj[data] = false;
      nextTick(() => {
        pageData.pageAliveObj[data] = true;
      });
    });

    return {
      transitionName: computed(() => menuState.transitionName.value),
      hasOpenComponentsArr,
      ...toRefs(pageData),
    };
  },

  components: myComponent,
});
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解设计模式:外观模式

外观模式&#xff08;Facade Pattern&#xff09;&#xff0c;又称为门面模式&#xff0c;是 GoF 的 23 种设计模式中的一种结构型设计模式。 外观模式 是指提供一个统一的接口去访问多个子系统的多个不同的接口&#xff0c;它为子系统中的一组接口提供一个统一的高层接口。使得…

jeecgboot — docker 搭建 jeecgboot 项目 +本地VUE2 前端

后端&#xff1a; Docker镜像单体启动项目 1. 下载项目 git clone https://gitee.com/jeecg/jeecg-boot.git2. 本地配置host # jeecgboot 127.0.0.1 jeecg-boot-mysql 127.0.0.1 jeecg-boot-redis 127.0.0.1 jeecg-boot-system注意&#xff1a; 如果本地安装了mysql和…

基于PHP+MySQL超市库存管理系统的设计与实现

随着经济的高速发展,超市的信息化工作也在如火如荼地进行,由于超市规模的不断扩大以及商务往来的日益增多,超市对进销存信息的掌握和使用就越来越多,因此以前的原始的手工操作方式就不能适应超市快速发展的需要,在计算机科学技术日益发展和成熟的今天,运用其先进的技术性来管理…

Qt 自定义主题颜色,颜色选择器

灵感及素材来源&#xff1a; 暗玉紫 - 中国色 - 中国传统颜色 (zhongguose.com)http://zhongguose.com/#anyuzi实现效果 中国色 2022-11-29 15-37-121、支持读取颜色配置文件 2、支持动态添加自定义颜色 3、可自由调节颜色RGB值 4、三个圆形按钮显示和调整RGB&#xff0c;四…

nuxtjs中asyncData异步数据请求、代理配置、fetch网络请求、vuex的使用、中间件处理

文章目录1. asyncData异步数据请求2. 代理配置3. fetch网络请求4. vuex4.1 state中的数据展示4.2 同步方法与异步方法4.3 数据持久化处理5. 中间件处理1. asyncData异步数据请求 Nuxt.js 扩展了 Vue.js&#xff0c;增加了一个叫 asyncData 和 fetch 的方法&#xff0c;使得我们…

天宇优配|突然爆雷!大跌15%!

大家好&#xff0c;来一起重视上午的市场行情及最新资讯~ 11月30日上午&#xff0c;上证指数低开0.27%&#xff0c;深证成指跌0.16%&#xff0c;创业板指跌0.16%。盘面上&#xff0c;地产股持续发力&#xff0c;大消费、金融、航运等板块回调。 港股方面&#xff0c;恒指低开0…

命令模式

文章目录思考命令模式1.命令模式的本质2.何时选用命令模式3.优缺点4.实现耦合写法命令模式写法命令模式撤销思考命令模式 命令模式就是解耦强耦合代码&#xff0c;用户只关心功能的实现&#xff0c;开发者却可以利用命令模式在这之间加一些小动作&#xff0c;比如&#xff1a;撤…

天翎知识文档系统+群晖NAS,助力企业实现移动化学习

编者按&#xff1a;移动化学习成为一种社会发展趋势&#xff0c;本文分析了企业移动化学习的意义&#xff0c;并提出了企业移动化学习的一款全新解决方案——天翎知识文档系统群晖NAS。 关键词&#xff1a;多端适配&#xff0c;学习培训&#xff0c;智能问答&#xff0c;在线预…

Javascript脚本运算符执行顺序对照表

Javascript脚本运算符执行顺序对照表&#xff1a;在线查看Javascript脚本运算符执行优先级别 窍门&#xff1a; CtrlF 快速查找 Javascript脚本运算符优先级&#xff0c;是描述在计算机计算表达式时执行运算的先后顺序。Javascript脚本运算符优先级表&#xff0c;同一行中的运算…

巴西队提前出线,预定大力神杯?数据分析告诉你,到底谁才是冠军

2022年卡塔尔世界杯的第一轮小组赛&#xff0c;已经在众多惊诧、悲伤、惊喜的情绪中结束&#xff0c;而仅仅是第一轮的小组比赛&#xff0c;不断爆出的冷门就足以使人大跌眼镜了&#xff1a; 连续34场世界大赛不败的潘帕斯雄鹰——阿根廷&#xff0c;1-2负于世界排名51的沙特&…

天宇优配|百股涨停再现,沪指盘中创近两个月新高

周二A股商场呈现普涨格局&#xff0c;上证指数上涨2.31%&#xff0c;盘中最高点位创出最近两个月新高。各大职业板块近乎全线上涨&#xff0c;地产板块个股掀起涨停潮&#xff0c;数十只地产债盘中涨光临停。此外&#xff0c;A股大金融体现强势&#xff0c;疫苗股则尾盘忽然暴力…

号称Java圣经,Github上爆火的1058页JVM全栈小册到底有什么魅力

对于JVM&#xff0c;我想大部分小伙伴都是要面试了才会去学&#xff0c;其余时间基本不会去看&#xff08;掐指一算&#xff0c;你们书架上面的深入理解Java虚拟机第三版应该都一层灰了吧【手动狗头】&#xff09;。但值得一说的是&#xff0c;当你工作多年之后&#xff0c;你遇…

基于LSCF和LSFD算法在频域中识别快速实现的MIMO研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

TensorFlow Lite 是什么?用 TensorFlow Lite 来转换模型(附代码)

文章目录TensorFlow Lite 做了什么&#xff1f;将一个模型用 TensorFlow Lite 转换训练一个简易模型保存模型转换模型加载 TFLite 模型并分配张量进行预测将在猫狗大战数据集上进行迁移学习的 MobileNetV2 转换到 TensorFlow Lite将模型转换到 TensorFlow Lite优化模型Referenc…

DFL3:软件版本的选择和安装详解

这本是一个简单的问题&#xff0c;但是对于新手而言&#xff0c;所有问题&#xff0c;总是说的越清楚越仔细越好。我之所以这么说&#xff0c;肯定是有人问了。所以我就专门开一篇文章来说一说&#xff0c;软件版本的异同&#xff0c;以及如何选择。针对不同的语言&#xff0c;…

如何快速定位到报错日志中的关键信息,一招学会,赶快GET吧

一般的服务器日志一个可能大的有几十上百m&#xff0c;小的也得几百k&#xff0c;里面内容是比较多的&#xff0c;如拿到日志没思路去看的话&#xff0c;下面一些办法可以让你快速定位到日志中的异常错误信息 文章目录步骤1:定位到错误信息再那个日志中(grep)步骤2:查看日志上下…

[附源码]计算机毕业设计springboot教育企业网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

鲲鹏devkit性能分析工具介绍(三)

鲲鹏devkit性能分析工具介绍&#xff08;三&#xff09; 本篇主要讲解鲲鹏devkit性能分析工具的访存分析功能 访存分析 访存统计分析基于CPU访问缓存和内存的PMU事件&#xff0c;分析存储的访问次数、命中率、带宽等情况。 Miss事件分析基于ARM SPE&#xff08;Statistical…

固话号码认证有什么好处?固话号码认证有什么作用?

固话号码认证为企业提供号码认证服务&#xff0c;在来电时显示企业信息&#xff0c;可提高电话号码辨识度&#xff0c;防止错误标记&#xff0c;确保展现的企业信息与企业的手机终端、APP等多平台展示信息一致&#xff0c;保证品牌企业的身份及商业价值。 那如何上线号码认证服…

图的初识·基本概念

文章目录基本概念图有两种基本形式无向图的表示有向图的表示基本概念 图结构也是数据结构的一部分。而且还有一点小难。图是由多个结点链接而成的&#xff0c;但是一个结点可以同时连接多个其他结点&#xff0c;多个节点也可以同时指向一个节点。【多对多的关系】 图结构是任意…