Commit 5f2a927cd50a5efe4c9576528d944553c5243277

Authored by nebv
1 parent 03b6025d

perf: optimized page switching effect

package.json
1 1 {
2 2 "name": "vben-admin-2.0",
3   - "version": "2.0.0-beta.4",
  3 + "version": "2.0.0-beta.5",
4 4 "scripts": {
5 5 "bootstrap": "yarn install",
6 6 "serve": "ts-node --project ./build/tsconfig.json ./build/script/preserve && cross-env NODE_ENV=development vite",
... ... @@ -55,7 +55,6 @@
55 55 "@typescript-eslint/parser": "^4.4.0",
56 56 "@vue/compiler-sfc": "^3.0.0",
57 57 "autoprefixer": "^9.8.6",
58   - "babel-plugin-import": "^1.13.0",
59 58 "commitizen": "^4.2.1",
60 59 "conventional-changelog-cli": "^2.1.0",
61 60 "conventional-changelog-custom-config": "^0.3.1",
... ...
src/components/Menu/src/BasicMenu.tsx
1 1 import type { MenuState } from './types';
2 2 import type { Menu as MenuType } from '/@/router/types';
3 3  
4   -import {
5   - computed,
6   - defineComponent,
7   - unref,
8   - reactive,
9   - toRef,
10   - watch,
11   - onMounted,
12   - watchEffect,
13   - ref,
14   -} from 'vue';
  4 +import { computed, defineComponent, unref, reactive, toRef, watch, onMounted, ref } from 'vue';
15 5 import { basicProps } from './props';
16 6 import { Menu } from 'ant-design-vue';
17 7 import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';
... ... @@ -106,11 +96,18 @@ export default defineComponent({
106 96 getParentPath();
107 97 }
108 98 );
109   - watchEffect(() => {
110   - if (props.items) {
111   - handleMenuChange();
  99 +
  100 + watch(
  101 + () => props.items,
  102 + () => {
  103 + if (props.items) {
  104 + handleMenuChange();
  105 + }
  106 + },
  107 + {
  108 + immediate: true,
112 109 }
113   - });
  110 + );
114 111  
115 112 async function getParentPath() {
116 113 const { appendClass } = props;
... ...
src/layouts/default/LayoutSideBar.tsx
... ... @@ -158,7 +158,6 @@ export default defineComponent({
158 158 menuSetting: { theme, split: splitMenu },
159 159 } = unref(getProjectConfigRef);
160 160 const { getCollapsedState, getMenuWidthState } = menuStore;
161   -
162 161 return (
163 162 <Layout.Sider
164 163 onCollapse={onCollapseChange}
... ...
src/layouts/default/index.less
1 1 @import (reference) '../../design/index.less';
2 2  
  3 +.ant-menu-submenu .ant-menu-sub {
  4 + transition: background 0.1s cubic-bezier(0.645, 0.045, 0.355, 1) 0s,
  5 + padding 0.1s cubic-bezier(0.645, 0.045, 0.355, 1) 0s !important;
  6 +}
  7 +
3 8 .default-layout {
4 9 &__content {
5 10 position: relative;
... ...
src/layouts/default/setting/SettingDrawer.tsx
... ... @@ -262,7 +262,7 @@ export default defineComponent({
262 262 size="small"
263 263 min={0}
264 264 onChange={(e) => {
265   - baseHandler('menuWidth', e);
  265 + baseHandler('lockTime', e);
266 266 }}
267 267 defaultValue={appStore.getProjectConfig.lockTime}
268 268 formatter={(value: string) => {
... ... @@ -448,7 +448,7 @@ export default defineComponent({
448 448 },
449 449 };
450 450 }
451   - if (event === 'menuWidth') {
  451 + if (event === 'lockTime') {
452 452 config = {
453 453 lockTime: value,
454 454 };
... ...
src/layouts/iframe/useFrameKeepAlive.ts
... ... @@ -32,9 +32,6 @@ export function useFrameKeepAlive() {
32 32 const getFramePages = computed(() => {
33 33 const ret =
34 34 getAllFramePages((toRaw(router.getRoutes()) as unknown) as AppRouteRecordRaw[]) || [];
35   - console.log('======================');
36   - console.log(ret);
37   - console.log('======================');
38 35 return ret;
39 36 });
40 37  
... ...
src/layouts/page/index.tsx
... ... @@ -40,6 +40,7 @@ export default defineComponent({
40 40 <RouterView>
41 41 {{
42 42 default: ({ Component, route }: { Component: any; route: RouteLocation }) => {
  43 + const name = route.meta.inTab ? ' ' : null;
43 44 const Content = openCache ? (
44 45 <KeepAlive max={max} include={cacheTabs}>
45 46 <Component {...route.params} />
... ... @@ -50,7 +51,7 @@ export default defineComponent({
50 51 return openRouterTransition ? (
51 52 <Transition
52 53 {...on}
53   - name={route.meta.transitionName || routerTransition}
  54 + name={name || route.meta.transitionName || routerTransition}
54 55 mode="out-in"
55 56 >
56 57 {() => Content}
... ...
src/router/guard/progressGuard.ts
... ... @@ -2,17 +2,20 @@ import type { Router } from &#39;vue-router&#39;;
2 2  
3 3 import NProgress from 'nprogress';
4 4 import 'nprogress/nprogress.css';
  5 +import { getIsOpenTab } from '/@/utils/helper/routeHelper';
5 6  
6 7 export function createProgressGuard(router: Router) {
7   - NProgress.inc(0.1);
8   - NProgress.configure({ easing: 'ease', speed: 200, showSpinner: false });
  8 + // NProgress.inc(0.1);
  9 + // NProgress.configure({ easing: 'ease', speed: 200, showSpinner: false });
9 10  
10   - router.beforeEach(async () => {
11   - NProgress.start();
  11 + router.beforeEach(async (to) => {
  12 + const isOpen = getIsOpenTab(to.path);
  13 + to.meta.inTab = isOpen;
  14 + !isOpen && NProgress.start();
12 15 return true;
13 16 });
14   - router.afterEach(async () => {
15   - NProgress.done();
  17 + router.afterEach(async (to) => {
  18 + !to.meta.inTab && NProgress.done();
16 19 return true;
17 20 });
18 21 }
... ...
src/router/types.d.ts
... ... @@ -29,6 +29,8 @@ export interface RouteMeta {
29 29  
30 30 // close loading
31 31 afterCloseLoading?: boolean;
  32 +
  33 + inTab?: boolean;
32 34 }
33 35  
34 36 export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
... ...
src/useApp.tsx renamed to src/useApp.ts
src/utils/helper/routeHelper.ts
1 1 import type { AppRouteModule, AppRouteRecordRaw } from '/@/router/types';
2 2 import type { RouteRecordRaw } from 'vue-router';
3 3  
  4 +import { appStore } from '/@/store/modules/app';
  5 +import { tabStore } from '/@/store/modules/tab';
4 6 import { createRouter, createWebHashHistory } from 'vue-router';
5 7 import { toRaw } from 'vue';
6 8 import { PAGE_LAYOUT_COMPONENT } from '/@/router/constant';
... ... @@ -45,3 +47,13 @@ export function transformObjToRoute(routeList: AppRouteModule[]) {
45 47 });
46 48 return routeList;
47 49 }
  50 +
  51 +export function getIsOpenTab(toPath: string) {
  52 + const { openKeepAlive, multiTabsSetting: { show } = {} } = appStore.getProjectConfig;
  53 +
  54 + if (show && openKeepAlive) {
  55 + const tabList = tabStore.getTabsState;
  56 + return tabList.some((tab) => tab.path === toPath);
  57 + }
  58 + return false;
  59 +}
... ...
yarn.lock
... ... @@ -95,7 +95,7 @@
95 95 dependencies:
96 96 "@babel/types" "^7.11.0"
97 97  
98   -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4":
  98 +"@babel/helper-module-imports@^7.10.4":
99 99 version "7.10.4"
100 100 resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
101 101 integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==
... ... @@ -175,7 +175,7 @@
175 175 resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
176 176 integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
177 177  
178   -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.4", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2":
  178 +"@babel/runtime@^7.10.4", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2":
179 179 version "7.11.2"
180 180 resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
181 181 integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
... ... @@ -1214,14 +1214,6 @@ babel-helper-vue-jsx-merge-props@^2.0.3:
1214 1214 resolved "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6"
1215 1215 integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==
1216 1216  
1217   -babel-plugin-import@^1.13.0:
1218   - version "1.13.0"
1219   - resolved "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.0.tgz#c532fd533df9db53b47d4d4db3676090fc5c07a5"
1220   - integrity sha512-bHU8m0SrY89ub2hBBuYjbennOeH0YUYkVpH6jxKFk0uD8rhN+0jNHIPtXnac+Vn7N/hgkLGGDcIoYK7je3Hhew==
1221   - dependencies:
1222   - "@babel/helper-module-imports" "^7.0.0"
1223   - "@babel/runtime" "^7.0.0"
1224   -
1225 1217 bail@^1.0.0:
1226 1218 version "1.0.5"
1227 1219 resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
... ...