¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- @author ruoyi 20201128 æ¯æä¸çº§ä»¥ä¸èåç¼å --> |
| | | <template> |
| | | <section class="app-main"> |
| | | <transition name="fade-transform" mode="out-in"> |
| | | <keep-alive :max="20" :exclude="notCacheName"> |
| | | <router-view :key="key" /> |
| | | </keep-alive> |
| | | </transition> |
| | | </section> |
| | | </template> |
| | | |
| | | <script> |
| | | import Global from "@/layout/components/global.js"; |
| | | |
| | | export default { |
| | | name: 'AppMain', |
| | | computed: { |
| | | notCacheName() { |
| | | var visitedViews = this.$store.state.tagsView.visitedViews; |
| | | var noCacheViews = []; |
| | | Object.keys(visitedViews).some((index) => { |
| | | if (visitedViews[index].meta.noCache) { |
| | | noCacheViews.push(visitedViews[index].name); |
| | | } |
| | | }); |
| | | return noCacheViews; |
| | | }, |
| | | key() { |
| | | return this.$route.path; |
| | | }, |
| | | }, |
| | | mounted() { |
| | | // å
³éæ ç¾è§¦å |
| | | Global.$on("removeCache", (name, view) => { |
| | | this.removeCache(name, view); |
| | | }); |
| | | }, |
| | | methods: { |
| | | // è·åækeep-aliveåèç¹çVnode |
| | | getVnode() { |
| | | // 夿åéé空 |
| | | if (this.$children.length == 0) return false; |
| | | let vnode; |
| | | for (let item of this.$children) { |
| | | // 妿data䏿keyå代表æ¾å°äºkeep-aliveä¸é¢çåéï¼è¿ä¸ªkeyå°±æ¯router-viewä¸çkey |
| | | if (item.$vnode.data.key) { |
| | | vnode = item.$vnode; |
| | | break; |
| | | } |
| | | } |
| | | return vnode ? vnode : false; |
| | | }, |
| | | // ç§»é¤keep-aliveç¼å |
| | | removeCache(name, view = {}) { |
| | | let vnode = this.getVnode(); |
| | | if (!vnode) return false; |
| | | let componentInstance = vnode.parent.componentInstance; |
| | | // è¿ä¸ªkeyæ¯ç¨æ¥è·ååç¼ç¨æ¥å颿£åå¹é
ç¨ç |
| | | let keyStart = vnode.key.split("/")[0]; |
| | | let thisKey = `${keyStart}${view.fullPath}`; |
| | | let regKey = `${keyStart}${view.path}`; |
| | | |
| | | this[name]({ componentInstance, thisKey, regKey }); |
| | | }, |
| | | // ç§»é¤å
¶ä» |
| | | closeOthersTags({ componentInstance, thisKey }) { |
| | | Object.keys(componentInstance.cache).forEach((key, index) => { |
| | | if (key != thisKey) { |
| | | // 鿝å®ä¾(è¿éåå¨å¤ä¸ªkeyæåä¸ä¸ªç¼åçæ
åµå¯è½åé¢ä¸ä¸ªå·²ç»æ¸
é¤æäºææè¦å 夿) |
| | | if (componentInstance.cache[key]) { |
| | | componentInstance.cache[key].componentInstance.$destroy(); |
| | | } |
| | | // å é¤ç¼å |
| | | delete componentInstance.cache[key]; |
| | | // ç§»é¤keyä¸å¯¹åºçkey |
| | | componentInstance.keys.splice(index, 1); |
| | | } |
| | | }); |
| | | }, |
| | | // ç§»é¤ææç¼å |
| | | closeAllTags({ componentInstance }) { |
| | | // 鿝å®ä¾ |
| | | Object.keys(componentInstance.cache).forEach((key) => { |
| | | if (componentInstance.cache[key]) { |
| | | componentInstance.cache[key].componentInstance.$destroy(); |
| | | } |
| | | }); |
| | | // å é¤ç¼å |
| | | componentInstance.cache = {}; |
| | | // ç§»é¤keyä¸å¯¹åºçkey |
| | | componentInstance.keys = []; |
| | | }, |
| | | // ç§»é¤å个ç¼å |
| | | closeSelectedTag({ componentInstance, regKey }) { |
| | | let reg = new RegExp(`^${regKey}`); |
| | | Object.keys(componentInstance.cache).forEach((key, i) => { |
| | | if (reg.test(key)) { |
| | | // 鿝å®ä¾ |
| | | if (componentInstance.cache[key]) { |
| | | componentInstance.cache[key].componentInstance.$destroy(); |
| | | } |
| | | // å é¤ç¼å |
| | | delete componentInstance.cache[key]; |
| | | // ç§»é¤keyä¸å¯¹åºçkey |
| | | componentInstance.keys.splice(i, 1); |
| | | } |
| | | }); |
| | | }, |
| | | // å·æ°å个ç¼å |
| | | refreshSelectedTag({ componentInstance, thisKey }) { |
| | | Object.keys(componentInstance.cache).forEach((key, index) => { |
| | | if (null != thisKey && key.replace("/redirect", "") == thisKey) { |
| | | // 1 鿝å®ä¾(è¿éåå¨å¤ä¸ªkeyæåä¸ä¸ªç¼åçæ
åµå¯è½åé¢ä¸ä¸ªå·²ç»æ¸
é¤æäºææè¦å 夿) |
| | | if (componentInstance.cache[key]) { |
| | | componentInstance.cache[key].componentInstance.$destroy(); |
| | | } |
| | | // 2 å é¤ç¼å |
| | | delete componentInstance.cache[key]; |
| | | // 3 ç§»é¤keyä¸å¯¹åºçkey |
| | | componentInstance.keys.splice(index, 1); |
| | | } |
| | | }); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .app-main { |
| | | /* 50= navbar 50 */ |
| | | min-height: calc(100vh - 50px); |
| | | width: 100%; |
| | | position: relative; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .fixed-header + .app-main { |
| | | padding-top: 50px; |
| | | } |
| | | |
| | | .hasTagsView { |
| | | .app-main { |
| | | /* 84 = navbar + tags-view = 50 + 34 */ |
| | | min-height: calc(100vh - 84px); |
| | | } |
| | | |
| | | .fixed-header + .app-main { |
| | | padding-top: 84px; |
| | | } |
| | | } |
| | | </style> |
| | | |
| | | <style lang="scss"> |
| | | // fix css style bug in open el-dialog |
| | | .el-popup-parent--hidden { |
| | | .fixed-header { |
| | | padding-right: 15px; |
| | | } |
| | | } |
| | | </style> |