From ecc7a8be46475f5d7235073214857e241d4741dd Mon Sep 17 00:00:00 2001
From: RuoYi <yzz_ivy@163.com>
Date: 星期三, 16 十二月 2020 20:57:48 +0800
Subject: [PATCH] 优化多级菜单之间切换无法缓存的问题
---
ruoyi-ui/src/layout/components/Sidebar/index.vue | 4
ruoyi-ui/src/store/modules/permission.js | 51 ++++++++++--
ruoyi-ui/src/views/tool/gen/editTable.vue | 2
ruoyi-ui/src/views/system/user/profile/resetPwd.vue | 2
ruoyi-ui/src/layout/components/AppMain.vue | 121 ++----------------------------
ruoyi-ui/src/layout/components/TagsView/index.vue | 5 -
ruoyi-ui/src/store/getters.js | 3
ruoyi-ui/src/views/system/user/profile/userInfo.vue | 2
8 files changed, 55 insertions(+), 135 deletions(-)
diff --git a/ruoyi-ui/src/layout/components/AppMain.vue b/ruoyi-ui/src/layout/components/AppMain.vue
index 8da5714..423437b 100644
--- a/ruoyi-ui/src/layout/components/AppMain.vue
+++ b/ruoyi-ui/src/layout/components/AppMain.vue
@@ -1,8 +1,7 @@
-<!-- @author ruoyi 20201128 支持三级以上菜单缓存 -->
<template>
<section class="app-main">
<transition name="fade-transform" mode="out-in">
- <keep-alive :max="20" :exclude="notCacheName">
+ <keep-alive :include="cachedViews">
<router-view :key="key" />
</keep-alive>
</transition>
@@ -10,119 +9,17 @@
</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;
+ cachedViews() {
+ return this.$store.state.tagsView.cachedViews
},
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);
- }
- });
- },
- },
-};
+ return this.$route.path
+ }
+ }
+}
</script>
<style lang="scss" scoped>
@@ -134,7 +31,7 @@
overflow: hidden;
}
-.fixed-header + .app-main {
+.fixed-header+.app-main {
padding-top: 50px;
}
@@ -144,7 +41,7 @@
min-height: calc(100vh - 84px);
}
- .fixed-header + .app-main {
+ .fixed-header+.app-main {
padding-top: 84px;
}
}
diff --git a/ruoyi-ui/src/layout/components/Sidebar/index.vue b/ruoyi-ui/src/layout/components/Sidebar/index.vue
index 0a87943..9fb23fb 100644
--- a/ruoyi-ui/src/layout/components/Sidebar/index.vue
+++ b/ruoyi-ui/src/layout/components/Sidebar/index.vue
@@ -13,7 +13,7 @@
mode="vertical"
>
<sidebar-item
- v-for="(route, index) in permission_routes"
+ v-for="(route, index) in sidebarRouters"
:key="route.path + index"
:item="route"
:base-path="route.path"
@@ -33,7 +33,7 @@
components: { SidebarItem, Logo },
computed: {
...mapState(["settings"]),
- ...mapGetters(["permission_routes", "sidebar"]),
+ ...mapGetters(["sidebarRouters", "sidebar"]),
activeMenu() {
const route = this.$route;
const { meta, path } = route;
diff --git a/ruoyi-ui/src/layout/components/TagsView/index.vue b/ruoyi-ui/src/layout/components/TagsView/index.vue
index 23eb8f0..dce967c 100644
--- a/ruoyi-ui/src/layout/components/TagsView/index.vue
+++ b/ruoyi-ui/src/layout/components/TagsView/index.vue
@@ -29,7 +29,6 @@
<script>
import ScrollPane from './ScrollPane'
import path from 'path'
-import Global from "@/layout/components/global.js";
export default {
components: { ScrollPane },
@@ -145,7 +144,6 @@
})
})
})
- Global.$emit("removeCache", "refreshSelectedTag", this.selectedTag);
},
closeSelectedTag(view) {
this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => {
@@ -153,14 +151,12 @@
this.toLastView(visitedViews, view)
}
})
- Global.$emit("removeCache", "closeSelectedTag", view);
},
closeOthersTags() {
this.$router.push(this.selectedTag)
this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => {
this.moveToCurrentTag()
})
- Global.$emit("removeCache", "closeOthersTags", this.selectedTag);
},
closeAllTags(view) {
this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => {
@@ -169,7 +165,6 @@
}
this.toLastView(visitedViews, view)
})
- Global.$emit("removeCache", "closeAllTags");
},
toLastView(visitedViews, view) {
const latestView = visitedViews.slice(-1)[0]
diff --git a/ruoyi-ui/src/store/getters.js b/ruoyi-ui/src/store/getters.js
index b985521..ea4f90e 100644
--- a/ruoyi-ui/src/store/getters.js
+++ b/ruoyi-ui/src/store/getters.js
@@ -10,6 +10,7 @@
introduction: state => state.user.introduction,
roles: state => state.user.roles,
permissions: state => state.user.permissions,
- permission_routes: state => state.permission.routes
+ permission_routes: state => state.permission.routes,
+ sidebarRouters:state => state.permission.sidebarRouters,
}
export default getters
diff --git a/ruoyi-ui/src/store/modules/permission.js b/ruoyi-ui/src/store/modules/permission.js
index 260d8af..c2fb123 100644
--- a/ruoyi-ui/src/store/modules/permission.js
+++ b/ruoyi-ui/src/store/modules/permission.js
@@ -6,13 +6,17 @@
const permission = {
state: {
routes: [],
- addRoutes: []
+ addRoutes: [],
+ sidebarRouters: []
},
mutations: {
SET_ROUTES: (state, routes) => {
state.addRoutes = routes
state.routes = constantRoutes.concat(routes)
- }
+ },
+ SET_SIDEBAR_ROUTERS: (state, routers) => {
+ state.sidebarRouters = routers
+ },
},
actions: {
// 生成路由
@@ -20,10 +24,14 @@
return new Promise(resolve => {
// 向后端请求路由数据
getRouters().then(res => {
- const accessedRoutes = filterAsyncRouter(res.data)
- accessedRoutes.push({ path: '*', redirect: '/404', hidden: true })
- commit('SET_ROUTES', accessedRoutes)
- resolve(accessedRoutes)
+ const sdata = JSON.parse(JSON.stringify(res.data))
+ const rdata = JSON.parse(JSON.stringify(res.data))
+ const sidebarRoutes = filterAsyncRouter(sdata)
+ const rewriteRoutes = filterAsyncRouter(rdata, true)
+ rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
+ commit('SET_ROUTES', rewriteRoutes)
+ commit('SET_SIDEBAR_ROUTERS', sidebarRoutes)
+ resolve(rewriteRoutes)
})
})
}
@@ -31,8 +39,11 @@
}
// 遍历后台传来的路由字符串,转换为组件对象
-function filterAsyncRouter(asyncRouterMap) {
+function filterAsyncRouter(asyncRouterMap, isRewrite = false) {
return asyncRouterMap.filter(route => {
+ if (isRewrite && route.children) {
+ route.children = filterChildren(route.children)
+ }
if (route.component) {
// Layout ParentView 组件特殊处理
if (route.component === 'Layout') {
@@ -44,14 +55,36 @@
}
}
if (route.children != null && route.children && route.children.length) {
- route.children = filterAsyncRouter(route.children)
+ route.children = filterAsyncRouter(route.children, route, isRewrite)
}
return true
})
}
+function filterChildren(childrenMap) {
+ var children = []
+ childrenMap.forEach((el, index) => {
+ if (el.children && el.children.length) {
+ if (el.component === 'ParentView') {
+ el.children.forEach(c => {
+ c.path = el.path + '/' + c.path
+ if (c.children && c.children.length) {
+ children = children.concat(filterChildren(c.children, c))
+ return
+ }
+ children.push(c)
+ })
+ childrenMap.splice(index, 1)
+ return
+ }
+ }
+ children = children.concat(el)
+ })
+ return children
+}
+
export const loadView = (view) => { // 路由懒加载
- return (resolve) => require([`@/views/${view}`], resolve)
+ return (resolve) => require([`@/views/${view}`], resolve)
}
export default permission
diff --git a/ruoyi-ui/src/views/system/user/profile/resetPwd.vue b/ruoyi-ui/src/views/system/user/profile/resetPwd.vue
index bdefa79..1359717 100644
--- a/ruoyi-ui/src/views/system/user/profile/resetPwd.vue
+++ b/ruoyi-ui/src/views/system/user/profile/resetPwd.vue
@@ -18,7 +18,6 @@
<script>
import { updateUserPwd } from "@/api/system/user";
-import Global from "@/layout/components/global.js";
export default {
data() {
@@ -65,7 +64,6 @@
});
},
close() {
- Global.$emit("removeCache", "closeSelectedTag", this.$route);
this.$store.dispatch("tagsView/delView", this.$route);
this.$router.push({ path: "/index" });
}
diff --git a/ruoyi-ui/src/views/system/user/profile/userInfo.vue b/ruoyi-ui/src/views/system/user/profile/userInfo.vue
index 00e54ad..d52137d 100644
--- a/ruoyi-ui/src/views/system/user/profile/userInfo.vue
+++ b/ruoyi-ui/src/views/system/user/profile/userInfo.vue
@@ -24,7 +24,6 @@
<script>
import { updateUserProfile } from "@/api/system/user";
-import Global from "@/layout/components/global.js";
export default {
props: {
@@ -69,7 +68,6 @@
});
},
close() {
- Global.$emit("removeCache", "closeSelectedTag", this.$route);
this.$store.dispatch("tagsView/delView", this.$route);
this.$router.push({ path: "/index" });
}
diff --git a/ruoyi-ui/src/views/tool/gen/editTable.vue b/ruoyi-ui/src/views/tool/gen/editTable.vue
index 33d49cb..fea958e 100644
--- a/ruoyi-ui/src/views/tool/gen/editTable.vue
+++ b/ruoyi-ui/src/views/tool/gen/editTable.vue
@@ -127,7 +127,6 @@
import { getGenTable, updateGenTable } from "@/api/tool/gen";
import { optionselect as getDictOptionselect } from "@/api/system/dict/type";
import { listMenu as getMenuTreeselect } from "@/api/system/menu";
-import Global from "@/layout/components/global.js";
import basicInfoForm from "./basicInfoForm";
import genInfoForm from "./genInfoForm";
import Sortable from 'sortablejs'
@@ -208,7 +207,6 @@
},
/** 关闭按钮 */
close() {
- Global.$emit("removeCache", "closeSelectedTag", this.$route);
this.$store.dispatch("tagsView/delView", this.$route);
this.$router.push({ path: "/tool/gen", query: { t: Date.now()}})
}
--
Gitblit v1.9.2