欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > Vue iframe嵌套的页面实现路由缓存 实现keep-alive效果

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

2025/4/29 9:29:33 来源:https://blog.csdn.net/Jokerxiuka/article/details/144404836  浏览:    关键词: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;},// 根据当前路由设置hasOpenisOpenIframePage() {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>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词