优化页面内嵌iframe切换tab不刷新数据
This commit is contained in:
		
							parent
							
								
									99d1760b98
								
							
						
					
					
						commit
						7347cbaedf
					
				@ -12,11 +12,16 @@
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* fade-transform */
 | 
					/* fade-transform */
 | 
				
			||||||
 | 
					.fade-transform--move,
 | 
				
			||||||
.fade-transform-leave-active,
 | 
					.fade-transform-leave-active,
 | 
				
			||||||
.fade-transform-enter-active {
 | 
					.fade-transform-enter-active {
 | 
				
			||||||
  transition: all .5s;
 | 
					  transition: all .5s;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.fade-transform-leave-active {
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.fade-transform-enter {
 | 
					.fade-transform-enter {
 | 
				
			||||||
  opacity: 0;
 | 
					  opacity: 0;
 | 
				
			||||||
  transform: translateX(-30px);
 | 
					  transform: translateX(-30px);
 | 
				
			||||||
 | 
				
			|||||||
@ -2,15 +2,19 @@
 | 
				
			|||||||
  <section class="app-main">
 | 
					  <section class="app-main">
 | 
				
			||||||
    <transition name="fade-transform" mode="out-in">
 | 
					    <transition name="fade-transform" mode="out-in">
 | 
				
			||||||
      <keep-alive :include="cachedViews">
 | 
					      <keep-alive :include="cachedViews">
 | 
				
			||||||
        <router-view :key="key" />
 | 
					        <router-view v-if="!$route.meta.link" :key="key" />
 | 
				
			||||||
      </keep-alive>
 | 
					      </keep-alive>
 | 
				
			||||||
    </transition>
 | 
					    </transition>
 | 
				
			||||||
 | 
					    <iframe-toggle />
 | 
				
			||||||
  </section>
 | 
					  </section>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
 | 
					import iframeToggle from "./IframeToggle/index"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  name: 'AppMain',
 | 
					  name: 'AppMain',
 | 
				
			||||||
 | 
					  components: { iframeToggle },
 | 
				
			||||||
  computed: {
 | 
					  computed: {
 | 
				
			||||||
    cachedViews() {
 | 
					    cachedViews() {
 | 
				
			||||||
      return this.$store.state.tagsView.cachedViews
 | 
					      return this.$store.state.tagsView.cachedViews
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										24
									
								
								ruoyi-ui/src/layout/components/IframeToggle/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								ruoyi-ui/src/layout/components/IframeToggle/index.vue
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <transition-group name="fade-transform" mode="out-in">
 | 
				
			||||||
 | 
					    <inner-link
 | 
				
			||||||
 | 
					      v-for="(item, index) in iframeViews"
 | 
				
			||||||
 | 
					      :key="item.path"
 | 
				
			||||||
 | 
					      :iframeId="'iframe' + index"
 | 
				
			||||||
 | 
					      v-show="$route.path === item.path"
 | 
				
			||||||
 | 
					      :src="item.meta.link"
 | 
				
			||||||
 | 
					    ></inner-link>
 | 
				
			||||||
 | 
					  </transition-group>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import InnerLink from "../InnerLink/index"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  components: { InnerLink },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    iframeViews() {
 | 
				
			||||||
 | 
					      return this.$store.state.tagsView.iframeViews
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
@ -1,27 +1,47 @@
 | 
				
			|||||||
<script>
 | 
					<template>
 | 
				
			||||||
export default {
 | 
					  <div :style="'height:' + height" v-loading="loading" element-loading-text="正在加载页面,请稍候!">
 | 
				
			||||||
  data() {
 | 
					 | 
				
			||||||
    return {};
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  render() {
 | 
					 | 
				
			||||||
    const { $route: { meta: { link } }, } = this;
 | 
					 | 
				
			||||||
    if ({ link }.link === "") {
 | 
					 | 
				
			||||||
      return "404";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    let url = { link }.link;
 | 
					 | 
				
			||||||
    const height = document.documentElement.clientHeight - 94.5 + "px";
 | 
					 | 
				
			||||||
    const style = { height: height };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return (
 | 
					 | 
				
			||||||
      <div style={style}>
 | 
					 | 
				
			||||||
    <iframe
 | 
					    <iframe
 | 
				
			||||||
          src={url}
 | 
					      :id="iframeId"
 | 
				
			||||||
          frameborder="no"
 | 
					 | 
				
			||||||
      style="width: 100%; height: 100%"
 | 
					      style="width: 100%; height: 100%"
 | 
				
			||||||
          scrolling="auto"
 | 
					      :src="src"
 | 
				
			||||||
 | 
					      frameborder="no"
 | 
				
			||||||
    ></iframe>
 | 
					    ></iframe>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
    );
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    src: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: "/"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    iframeId: {
 | 
				
			||||||
 | 
					      type: String
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      loading: false,
 | 
				
			||||||
 | 
					      height: document.documentElement.clientHeight - 94.5 + "px;"
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  mounted() {
 | 
				
			||||||
 | 
					    var _this = this;
 | 
				
			||||||
 | 
					    const iframeId = ("#" + this.iframeId).replace(/\//g, "\\/");
 | 
				
			||||||
 | 
					    const iframe = document.querySelector(iframeId);
 | 
				
			||||||
 | 
					    // iframe页面loading控制
 | 
				
			||||||
 | 
					    if (iframe.attachEvent) {
 | 
				
			||||||
 | 
					      this.loading = true;
 | 
				
			||||||
 | 
					      iframe.attachEvent("onload", function () {
 | 
				
			||||||
 | 
					        _this.loading = false;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      this.loading = true;
 | 
				
			||||||
 | 
					      iframe.onload = function () {
 | 
				
			||||||
 | 
					        _this.loading = false;
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
				
			|||||||
@ -133,6 +133,9 @@ export default {
 | 
				
			|||||||
      const { name } = this.$route
 | 
					      const { name } = this.$route
 | 
				
			||||||
      if (name) {
 | 
					      if (name) {
 | 
				
			||||||
        this.$store.dispatch('tagsView/addView', this.$route)
 | 
					        this.$store.dispatch('tagsView/addView', this.$route)
 | 
				
			||||||
 | 
					        if (this.$route.meta.link) {
 | 
				
			||||||
 | 
					          this.$store.dispatch('tagsView/addIframeView', this.$route)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      return false
 | 
					      return false
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@ -153,6 +156,9 @@ export default {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    refreshSelectedTag(view) {
 | 
					    refreshSelectedTag(view) {
 | 
				
			||||||
      this.$tab.refreshPage(view);
 | 
					      this.$tab.refreshPage(view);
 | 
				
			||||||
 | 
					      if (this.$route.meta.link) {
 | 
				
			||||||
 | 
					        this.$store.dispatch('tagsView/delIframeView', this.$route)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    closeSelectedTag(view) {
 | 
					    closeSelectedTag(view) {
 | 
				
			||||||
      this.$tab.closePage(view).then(({ visitedViews }) => {
 | 
					      this.$tab.closePage(view).then(({ visitedViews }) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,17 @@
 | 
				
			|||||||
const state = {
 | 
					const state = {
 | 
				
			||||||
  visitedViews: [],
 | 
					  visitedViews: [],
 | 
				
			||||||
  cachedViews: []
 | 
					  cachedViews: [],
 | 
				
			||||||
 | 
					  iframeViews: []
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mutations = {
 | 
					const mutations = {
 | 
				
			||||||
 | 
					  ADD_IFRAME_VIEW: (state, view) => {
 | 
				
			||||||
 | 
					    if (state.iframeViews.some(v => v.path === view.path)) {
 | 
				
			||||||
 | 
					      return
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      state.iframeViews.push(view)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  ADD_VISITED_VIEW: (state, view) => {
 | 
					  ADD_VISITED_VIEW: (state, view) => {
 | 
				
			||||||
    if (state.visitedViews.some(v => v.path === view.path)) return
 | 
					    if (state.visitedViews.some(v => v.path === view.path)) return
 | 
				
			||||||
    state.visitedViews.push(
 | 
					    state.visitedViews.push(
 | 
				
			||||||
@ -18,7 +26,6 @@ const mutations = {
 | 
				
			|||||||
      state.cachedViews.push(view.name)
 | 
					      state.cachedViews.push(view.name)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					 | 
				
			||||||
  DEL_VISITED_VIEW: (state, view) => {
 | 
					  DEL_VISITED_VIEW: (state, view) => {
 | 
				
			||||||
    for (const [i, v] of state.visitedViews.entries()) {
 | 
					    for (const [i, v] of state.visitedViews.entries()) {
 | 
				
			||||||
      if (v.path === view.path) {
 | 
					      if (v.path === view.path) {
 | 
				
			||||||
@ -26,6 +33,10 @@ const mutations = {
 | 
				
			|||||||
        break
 | 
					        break
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    state.iframeViews = state.iframeViews.filter(item => item.path !== view.path)
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  DEL_IFRAME_VIEW: (state, view) => {
 | 
				
			||||||
 | 
					    state.iframeViews = state.iframeViews.filter(item => item.path !== view.path)
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  DEL_CACHED_VIEW: (state, view) => {
 | 
					  DEL_CACHED_VIEW: (state, view) => {
 | 
				
			||||||
    const index = state.cachedViews.indexOf(view.name)
 | 
					    const index = state.cachedViews.indexOf(view.name)
 | 
				
			||||||
@ -36,6 +47,7 @@ const mutations = {
 | 
				
			|||||||
    state.visitedViews = state.visitedViews.filter(v => {
 | 
					    state.visitedViews = state.visitedViews.filter(v => {
 | 
				
			||||||
      return v.meta.affix || v.path === view.path
 | 
					      return v.meta.affix || v.path === view.path
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					    state.iframeViews = state.iframeViews.filter(item => item.path === view.path)
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  DEL_OTHERS_CACHED_VIEWS: (state, view) => {
 | 
					  DEL_OTHERS_CACHED_VIEWS: (state, view) => {
 | 
				
			||||||
    const index = state.cachedViews.indexOf(view.name)
 | 
					    const index = state.cachedViews.indexOf(view.name)
 | 
				
			||||||
@ -45,16 +57,15 @@ const mutations = {
 | 
				
			|||||||
      state.cachedViews = []
 | 
					      state.cachedViews = []
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					 | 
				
			||||||
  DEL_ALL_VISITED_VIEWS: state => {
 | 
					  DEL_ALL_VISITED_VIEWS: state => {
 | 
				
			||||||
    // keep affix tags
 | 
					    // keep affix tags
 | 
				
			||||||
    const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
 | 
					    const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
 | 
				
			||||||
    state.visitedViews = affixTags
 | 
					    state.visitedViews = affixTags
 | 
				
			||||||
 | 
					    state.iframeViews = []
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  DEL_ALL_CACHED_VIEWS: state => {
 | 
					  DEL_ALL_CACHED_VIEWS: state => {
 | 
				
			||||||
    state.cachedViews = []
 | 
					    state.cachedViews = []
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					 | 
				
			||||||
  UPDATE_VISITED_VIEW: (state, view) => {
 | 
					  UPDATE_VISITED_VIEW: (state, view) => {
 | 
				
			||||||
    for (let v of state.visitedViews) {
 | 
					    for (let v of state.visitedViews) {
 | 
				
			||||||
      if (v.path === view.path) {
 | 
					      if (v.path === view.path) {
 | 
				
			||||||
@ -63,7 +74,6 @@ const mutations = {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  DEL_RIGHT_VIEWS: (state, view) => {
 | 
					  DEL_RIGHT_VIEWS: (state, view) => {
 | 
				
			||||||
    const index = state.visitedViews.findIndex(v => v.path === view.path)
 | 
					    const index = state.visitedViews.findIndex(v => v.path === view.path)
 | 
				
			||||||
    if (index === -1) {
 | 
					    if (index === -1) {
 | 
				
			||||||
@ -79,8 +89,9 @@ const mutations = {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      return false
 | 
					      return false
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					    const iframeIndex = state.iframeViews.findIndex(v => v.path === view.path)
 | 
				
			||||||
 | 
					    state.iframeViews = state.iframeViews.filter((item, idx) => idx <= iframeIndex)
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					 | 
				
			||||||
  DEL_LEFT_VIEWS: (state, view) => {
 | 
					  DEL_LEFT_VIEWS: (state, view) => {
 | 
				
			||||||
    const index = state.visitedViews.findIndex(v => v.path === view.path)
 | 
					    const index = state.visitedViews.findIndex(v => v.path === view.path)
 | 
				
			||||||
    if (index === -1) {
 | 
					    if (index === -1) {
 | 
				
			||||||
@ -96,6 +107,8 @@ const mutations = {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      return false
 | 
					      return false
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					    const iframeIndex = state.iframeViews.findIndex(v => v.path === view.path)
 | 
				
			||||||
 | 
					    state.iframeViews = state.iframeViews.filter((item, idx) => idx >= iframeIndex)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -104,13 +117,15 @@ const actions = {
 | 
				
			|||||||
    dispatch('addVisitedView', view)
 | 
					    dispatch('addVisitedView', view)
 | 
				
			||||||
    dispatch('addCachedView', view)
 | 
					    dispatch('addCachedView', view)
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  addIframeView({ commit }, view) {
 | 
				
			||||||
 | 
					    commit('ADD_IFRAME_VIEW', view)
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  addVisitedView({ commit }, view) {
 | 
					  addVisitedView({ commit }, view) {
 | 
				
			||||||
    commit('ADD_VISITED_VIEW', view)
 | 
					    commit('ADD_VISITED_VIEW', view)
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  addCachedView({ commit }, view) {
 | 
					  addCachedView({ commit }, view) {
 | 
				
			||||||
    commit('ADD_CACHED_VIEW', view)
 | 
					    commit('ADD_CACHED_VIEW', view)
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					 | 
				
			||||||
  delView({ dispatch, state }, view) {
 | 
					  delView({ dispatch, state }, view) {
 | 
				
			||||||
    return new Promise(resolve => {
 | 
					    return new Promise(resolve => {
 | 
				
			||||||
      dispatch('delVisitedView', view)
 | 
					      dispatch('delVisitedView', view)
 | 
				
			||||||
@ -127,13 +142,18 @@ const actions = {
 | 
				
			|||||||
      resolve([...state.visitedViews])
 | 
					      resolve([...state.visitedViews])
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  delIframeView({ commit, state }, view) {
 | 
				
			||||||
 | 
					    return new Promise(resolve => {
 | 
				
			||||||
 | 
					      commit('DEL_IFRAME_VIEW', view)
 | 
				
			||||||
 | 
					      resolve([...state.iframeViews])
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  delCachedView({ commit, state }, view) {
 | 
					  delCachedView({ commit, state }, view) {
 | 
				
			||||||
    return new Promise(resolve => {
 | 
					    return new Promise(resolve => {
 | 
				
			||||||
      commit('DEL_CACHED_VIEW', view)
 | 
					      commit('DEL_CACHED_VIEW', view)
 | 
				
			||||||
      resolve([...state.cachedViews])
 | 
					      resolve([...state.cachedViews])
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					 | 
				
			||||||
  delOthersViews({ dispatch, state }, view) {
 | 
					  delOthersViews({ dispatch, state }, view) {
 | 
				
			||||||
    return new Promise(resolve => {
 | 
					    return new Promise(resolve => {
 | 
				
			||||||
      dispatch('delOthersVisitedViews', view)
 | 
					      dispatch('delOthersVisitedViews', view)
 | 
				
			||||||
@ -156,7 +176,6 @@ const actions = {
 | 
				
			|||||||
      resolve([...state.cachedViews])
 | 
					      resolve([...state.cachedViews])
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					 | 
				
			||||||
  delAllViews({ dispatch, state }, view) {
 | 
					  delAllViews({ dispatch, state }, view) {
 | 
				
			||||||
    return new Promise(resolve => {
 | 
					    return new Promise(resolve => {
 | 
				
			||||||
      dispatch('delAllVisitedViews', view)
 | 
					      dispatch('delAllVisitedViews', view)
 | 
				
			||||||
@ -179,18 +198,15 @@ const actions = {
 | 
				
			|||||||
      resolve([...state.cachedViews])
 | 
					      resolve([...state.cachedViews])
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					 | 
				
			||||||
  updateVisitedView({ commit }, view) {
 | 
					  updateVisitedView({ commit }, view) {
 | 
				
			||||||
    commit('UPDATE_VISITED_VIEW', view)
 | 
					    commit('UPDATE_VISITED_VIEW', view)
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					 | 
				
			||||||
  delRightTags({ commit }, view) {
 | 
					  delRightTags({ commit }, view) {
 | 
				
			||||||
    return new Promise(resolve => {
 | 
					    return new Promise(resolve => {
 | 
				
			||||||
      commit('DEL_RIGHT_VIEWS', view)
 | 
					      commit('DEL_RIGHT_VIEWS', view)
 | 
				
			||||||
      resolve([...state.visitedViews])
 | 
					      resolve([...state.visitedViews])
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					 | 
				
			||||||
  delLeftTags({ commit }, view) {
 | 
					  delLeftTags({ commit }, view) {
 | 
				
			||||||
    return new Promise(resolve => {
 | 
					    return new Promise(resolve => {
 | 
				
			||||||
      commit('DEL_LEFT_VIEWS', view)
 | 
					      commit('DEL_LEFT_VIEWS', view)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user