| | |
| | | }
|
| | |
|
| | | /* 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);
|
| | |
| | | <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>
|
¶Ô±ÈÐÂÎļþ |
| | |
| | | <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>
|
| | |
| | | <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="æ£å¨å 载页é¢ï¼è¯·ç¨åï¼">
|
| | | <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>
|
| | |
| | | const { name } = route
|
| | | if (name) {
|
| | | useTagsViewStore().addView(route)
|
| | | if (route.meta.link) {
|
| | | useTagsViewStore().addIframeView(route);
|
| | | }
|
| | | }
|
| | | return false
|
| | | }
|
| | |
| | | }
|
| | | function refreshSelectedTag(view) {
|
| | | proxy.$tab.refreshPage(view);
|
| | | if (route.meta.link) {
|
| | | useTagsViewStore().delIframeView(route);
|
| | | }
|
| | | }
|
| | | function closeSelectedTag(view) {
|
| | | proxy.$tab.closePage(view).then(({ visitedViews }) => {
|
| | |
| | | {
|
| | | 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
|
| | |
| | | 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) {
|
| | |
| | | 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])
|
| | | })
|
| | | },
|
| | |
| | | return new Promise(resolve => {
|
| | | const affixTags = this.visitedViews.filter(tag => tag.meta.affix)
|
| | | this.visitedViews = affixTags
|
| | | this.iframeViews = []
|
| | | resolve([...this.visitedViews])
|
| | | })
|
| | | },
|
| | |
| | | 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])
|
| | |
| | | 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])
|