Commit fef3644067b7ccac96ec9ae122e3f1c8b8fc58ef
1 parent
f4621cc6
fix: page switching did not return to the top
Showing
3 changed files
with
42 additions
and
30 deletions
src/router/guard/index.ts
1 | -import { isNavigationFailure, Router } from 'vue-router'; | |
1 | +import { isNavigationFailure, RouteLocationNormalized, Router } from 'vue-router'; | |
2 | 2 | |
3 | 3 | import { Modal, notification } from 'ant-design-vue'; |
4 | 4 | |
... | ... | @@ -19,6 +19,12 @@ import { REDIRECT_NAME } from '/@/router/constant'; |
19 | 19 | const { closeMessageOnSwitch, removeAllHttpPending } = useProjectSetting(); |
20 | 20 | const globSetting = useGlobSetting(); |
21 | 21 | |
22 | +const body = document.body; | |
23 | + | |
24 | +const isHash = (href: string) => { | |
25 | + return /^#/.test(href); | |
26 | +}; | |
27 | + | |
22 | 28 | export function createGuard(router: Router) { |
23 | 29 | let axiosCanceler: Nullable<AxiosCanceler>; |
24 | 30 | if (removeAllHttpPending) { |
... | ... | @@ -45,8 +51,13 @@ export function createGuard(router: Router) { |
45 | 51 | }); |
46 | 52 | |
47 | 53 | router.afterEach((to, from, failure) => { |
54 | + // scroll top | |
55 | + isHash((to as RouteLocationNormalized & { href: string })?.href) && body.scrollTo(0, 0); | |
56 | + | |
48 | 57 | loadedPageMap.set(to.path, true); |
58 | + | |
49 | 59 | const { t } = useI18n(); |
60 | + | |
50 | 61 | // change html title |
51 | 62 | to.name !== REDIRECT_NAME && setTitle(t(to.meta.title), globSetting.title); |
52 | 63 | ... | ... |
src/router/index.ts
... | ... | @@ -8,9 +8,11 @@ import { createGuard } from './guard/'; |
8 | 8 | import { basicRoutes } from './routes/'; |
9 | 9 | import { scrollBehavior } from './scrollBehaviour'; |
10 | 10 | |
11 | +export const hashRouter = createWebHashHistory(); | |
12 | + | |
11 | 13 | // app router |
12 | 14 | const router = createRouter({ |
13 | - history: createWebHashHistory(), | |
15 | + history: hashRouter, | |
14 | 16 | routes: basicRoutes as RouteRecordRaw[], |
15 | 17 | strict: true, |
16 | 18 | scrollBehavior: scrollBehavior, | ... | ... |
src/router/scrollBehaviour.ts
1 | +// see https://github.com/vuejs/vue-router-next/blob/master/playground/scrollWaiter.ts | |
2 | +import type { RouteLocationNormalized } from 'vue-router'; | |
3 | +// class ScrollQueue { | |
4 | +// private resolve: (() => void) | null = null; | |
5 | +// private promise: Promise<any> | null = null; | |
6 | + | |
7 | +// add() { | |
8 | +// this.promise = new Promise((resolve) => { | |
9 | +// this.resolve = resolve as () => void; | |
10 | +// }); | |
11 | +// } | |
12 | + | |
13 | +// flush() { | |
14 | +// this.resolve && this.resolve(); | |
15 | +// this.resolve = null; | |
16 | +// this.promise = null; | |
17 | +// } | |
18 | + | |
19 | +// async wait() { | |
20 | +// await this.promise; | |
21 | +// } | |
22 | +// } | |
23 | +// const scrollWaiter = new ScrollQueue(); | |
24 | + | |
1 | 25 | /** |
2 | 26 | * Handles the scroll behavior on route navigation |
3 | 27 | * |
... | ... | @@ -8,10 +32,9 @@ |
8 | 32 | */ |
9 | 33 | // @ts-ignore |
10 | 34 | export async function scrollBehavior(to, from, savedPosition) { |
11 | - await scrollWaiter.wait(); | |
35 | + // await scrollWaiter.wait(); | |
12 | 36 | // Use predefined scroll behavior if defined, defaults to no scroll behavior |
13 | - const behavior = document.documentElement.style.scrollBehavior || 'auto'; | |
14 | - | |
37 | + const behavior = 'smooth'; | |
15 | 38 | // Returning the `savedPosition` (if available) will result in a native-like |
16 | 39 | // behavior when navigating with back/forward buttons |
17 | 40 | if (savedPosition) { |
... | ... | @@ -24,7 +47,7 @@ export async function scrollBehavior(to, from, savedPosition) { |
24 | 47 | } |
25 | 48 | |
26 | 49 | // Check if any matched route config has meta that discourages scrolling to top |
27 | - if (to.matched.some((m: any) => m.meta.scrollToTop === false)) { | |
50 | + if (to.matched.some((m: RouteLocationNormalized) => m.meta.scrollToTop === false)) { | |
28 | 51 | // Leave scroll as it is |
29 | 52 | return false; |
30 | 53 | } |
... | ... | @@ -32,27 +55,3 @@ export async function scrollBehavior(to, from, savedPosition) { |
32 | 55 | // Always scroll to top |
33 | 56 | return { left: 0, top: 0, behavior }; |
34 | 57 | } |
35 | - | |
36 | -// see https://github.com/vuejs/vue-router-next/blob/master/playground/scrollWaiter.ts | |
37 | -class ScrollQueue { | |
38 | - private resolve: (() => void) | null = null; | |
39 | - private promise: Promise<any> | null = null; | |
40 | - | |
41 | - add() { | |
42 | - this.promise = new Promise((resolve) => { | |
43 | - this.resolve = resolve as () => void; | |
44 | - }); | |
45 | - } | |
46 | - | |
47 | - flush() { | |
48 | - this.resolve && this.resolve(); | |
49 | - this.resolve = null; | |
50 | - this.promise = null; | |
51 | - } | |
52 | - | |
53 | - async wait() { | |
54 | - await this.promise; | |
55 | - } | |
56 | -} | |
57 | - | |
58 | -export const scrollWaiter = new ScrollQueue(); | ... | ... |