diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2023-07-08 15:30:36 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2023-07-08 15:30:36 +0900 |
| commit | 15683370f0379360c475a9ad77bb802c43f6d181 (patch) | |
| tree | d320cbdef89b6b7bac2cb113297c311666c3aa4e /packages/frontend/src/nirax.ts | |
| parent | refactor: use esm (diff) | |
| download | sharkey-15683370f0379360c475a9ad77bb802c43f6d181.tar.gz sharkey-15683370f0379360c475a9ad77bb802c43f6d181.tar.bz2 sharkey-15683370f0379360c475a9ad77bb802c43f6d181.zip | |
fix(frontend): ページ遷移でスクロール位置が保持されない問題を修正
Fix #11068
Diffstat (limited to 'packages/frontend/src/nirax.ts')
| -rw-r--r-- | packages/frontend/src/nirax.ts | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/packages/frontend/src/nirax.ts b/packages/frontend/src/nirax.ts index 3fa6bd55e2..3a03444de2 100644 --- a/packages/frontend/src/nirax.ts +++ b/packages/frontend/src/nirax.ts @@ -1,7 +1,7 @@ // NIRAX --- A lightweight router import { EventEmitter } from 'eventemitter3'; -import { Component, shallowRef, ShallowRef } from 'vue'; +import { Component, onMounted, shallowRef, ShallowRef } from 'vue'; import { safeURIDecode } from '@/scripts/safe-uri-decode'; type RouteDef = { @@ -267,13 +267,33 @@ export class Router extends EventEmitter<{ }); } - public replace(path: string, key?: string | null, emitEvent = true) { + public replace(path: string, key?: string | null) { this.navigate(path, key); - if (emitEvent) { - this.emit('replace', { - path, - key: this.currentKey, - }); - } } } + +export function useScrollPositionManager(getScrollContainer: () => HTMLElement, router: Router) { + const scrollPosStore = new Map<string, number>(); + + onMounted(() => { + const scrollContainer = getScrollContainer(); + + scrollContainer.addEventListener('scroll', () => { + scrollPosStore.set(router.getCurrentKey(), scrollContainer.scrollTop); + }, { passive: true }); + + router.addListener('change', ctx => { + const scrollPos = scrollPosStore.get(ctx.key) ?? 0; + scrollContainer.scroll({ top: scrollPos, behavior: 'instant' }); + if (scrollPos !== 0) { + window.setTimeout(() => { // 遷移直後はタイミングによってはコンポーネントが復元し切ってない可能性も考えられるため少し時間を空けて再度スクロール + scrollContainer.scroll({ top: scrollPos, behavior: 'instant' }); + }, 100); + } + }); + + router.addListener('same', () => { + scrollContainer.scroll({ top: 0, behavior: 'smooth' }); + }); + }); +} |