From 439b134c9b54ce7fa89f7963ff1c62e79997c00a Mon Sep 17 00:00:00 2001 From: RuoYi <yzz_ivy@163.com> Date: 星期二, 23 八月 2022 20:47:41 +0800 Subject: [PATCH] 优化页面内嵌iframe切换tab不刷新数据 --- src/store/modules/tagsView.js | 28 +++++++++ src/layout/components/InnerLink/index.vue | 67 +++++++++++++--------- src/layout/components/IframeToggle/index.vue | 19 ++++++ src/assets/styles/transition.scss | 5 + src/layout/components/AppMain.vue | 11 +-- src/layout/components/TagsView/index.vue | 6 ++ 6 files changed, 101 insertions(+), 35 deletions(-) diff --git a/src/assets/styles/transition.scss b/src/assets/styles/transition.scss index 25e7e18..a712937 100644 --- a/src/assets/styles/transition.scss +++ b/src/assets/styles/transition.scss @@ -12,11 +12,16 @@ } /* fade-transform */ +.fade-transform--move, .fade-transform-leave-active, .fade-transform-enter-active { transition: all .5s; } +.fade-transform-leave-active { + position: absolute; +} + .fade-transform-enter { opacity: 0; transform: translateX(-30px); diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index c123f3e..045e49f 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -2,23 +2,20 @@ <section class="app-main"> <router-view v-slot="{ Component, route }"> <transition name="fade-transform" mode="out-in"> - <keep-alive :include="cachedViews"> - <component :is="Component" :key="route.path"/> + <keep-alive :include="tagsViewStore.cachedViews"> + <component v-if="!route.meta.link" :is="Component" :key="route.path"/> </keep-alive> </transition> </router-view> + <iframe-toggle /> </section> </template> <script setup> +import iframeToggle from "./IframeToggle/index" import useTagsViewStore from '@/store/modules/tagsView' const tagsViewStore = useTagsViewStore() -const route = useRoute() -tagsViewStore.addCachedView(route) -const cachedViews = computed(() => { - return tagsViewStore.cachedViews -}) </script> <style lang="scss" scoped> diff --git a/src/layout/components/IframeToggle/index.vue b/src/layout/components/IframeToggle/index.vue new file mode 100644 index 0000000..0b8c868 --- /dev/null +++ b/src/layout/components/IframeToggle/index.vue @@ -0,0 +1,19 @@ +<template> + <transition-group name="fade-transform" mode="out-in"> + <inner-link + v-for="(item, index) in tagsViewStore.iframeViews" + :key="item.path" + :iframeId="'iframe' + index" + v-show="route.path === item.path" + :src="item.meta.link" + ></inner-link> + </transition-group> +</template> + +<script setup> +import InnerLink from "../InnerLink/index" +import useTagsViewStore from '@/store/modules/tagsView' + +const route = useRoute(); +const tagsViewStore = useTagsViewStore() +</script> diff --git a/src/layout/components/InnerLink/index.vue b/src/layout/components/InnerLink/index.vue index cd303c4..a1c3ef6 100644 --- a/src/layout/components/InnerLink/index.vue +++ b/src/layout/components/InnerLink/index.vue @@ -1,30 +1,43 @@ -<script> -export default { - setup() { - const route = useRoute(); - const link = route.meta.link; - if (link === "") { - return "404"; - } - let url = link; - const height = document.documentElement.clientHeight - 94.5 + "px"; - const style = { height: height }; +<template> + <div :style="'height:' + height" v-loading="loading" element-loading-text="姝e湪鍔犺浇椤甸潰锛岃绋嶅�欙紒"> + <iframe + :id="iframeId" + style="width: 100%; height: 100%" + :src="src" + frameborder="no" + ></iframe> + </div> +</template> - // 杩斿洖娓叉煋鍑芥暟 - return () => - h( - "div", - { - style: style, - }, - h("iframe", { - src: url, - frameborder: "no", - width: "100%", - height: "100%", - scrolling: "auto", - }) - ); +<script setup> +const props = defineProps({ + src: { + type: String, + default: "/" }, -}; + iframeId: { + type: String + } +}); + +const height = ref(document.documentElement.clientHeight - 94.5 + "px"); +const loading = ref(false); + +onMounted(() => { + const { proxy } = getCurrentInstance() + const iframeId = ("#" + props.iframeId).replace(/\//g, "\\/"); + const iframe = document.querySelector(iframeId); + // iframe椤甸潰loading鎺у埗 + if (iframe.attachEvent) { + loading.value = true; + iframe.attachEvent("onload", function () { + proxy.loading = false; + }); + } else { + loading.value = true; + iframe.onload = function () { + proxy.loading = false; + }; + } +}) </script> diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue index 7d59c90..f33f9fc 100644 --- a/src/layout/components/TagsView/index.vue +++ b/src/layout/components/TagsView/index.vue @@ -141,6 +141,9 @@ const { name } = route if (name) { useTagsViewStore().addView(route) + if (route.meta.link) { + useTagsViewStore().addIframeView(route); + } } return false } @@ -159,6 +162,9 @@ } function refreshSelectedTag(view) { proxy.$tab.refreshPage(view); + if (route.meta.link) { + useTagsViewStore().delIframeView(route); + } } function closeSelectedTag(view) { proxy.$tab.closePage(view).then(({ visitedViews }) => { diff --git a/src/store/modules/tagsView.js b/src/store/modules/tagsView.js index f8986d7..b0d4ca1 100644 --- a/src/store/modules/tagsView.js +++ b/src/store/modules/tagsView.js @@ -3,12 +3,21 @@ { state: () => ({ visitedViews: [], - cachedViews: [] + cachedViews: [], + iframeViews: [] }), actions: { addView(view) { this.addVisitedView(view) this.addCachedView(view) + }, + addIframeView(view) { + if (this.iframeViews.some(v => v.path === view.path)) return + this.iframeViews.push( + Object.assign({}, view, { + title: view.meta.title || 'no-name' + }) + ) }, addVisitedView(view) { if (this.visitedViews.some(v => v.path === view.path)) return @@ -42,7 +51,14 @@ break } } + this.iframeViews = this.iframeViews.filter(item => item.path !== view.path) resolve([...this.visitedViews]) + }) + }, + delIframeView(view) { + return new Promise(resolve => { + this.iframeViews = this.iframeViews.filter(item => item.path !== view.path) + resolve([...this.iframeViews]) }) }, delCachedView(view) { @@ -67,6 +83,7 @@ this.visitedViews = this.visitedViews.filter(v => { return v.meta.affix || v.path === view.path }) + this.iframeViews = this.iframeViews.filter(item => item.path === view.path) resolve([...this.visitedViews]) }) }, @@ -95,6 +112,7 @@ return new Promise(resolve => { const affixTags = this.visitedViews.filter(tag => tag.meta.affix) this.visitedViews = affixTags + this.iframeViews = [] resolve([...this.visitedViews]) }) }, @@ -126,6 +144,10 @@ if (i > -1) { this.cachedViews.splice(i, 1) } + if(item.meta.link) { + const fi = this.iframeViews.findIndex(v => v.path === item.path) + this.iframeViews.splice(fi, 1) + } return false }) resolve([...this.visitedViews]) @@ -145,6 +167,10 @@ if (i > -1) { this.cachedViews.splice(i, 1) } + if(item.meta.link) { + const fi = this.iframeViews.findIndex(v => v.path === item.path) + this.iframeViews.splice(fi, 1) + } return false }) resolve([...this.visitedViews]) -- Gitblit v1.9.3