34 lines
1.1 KiB
TypeScript
34 lines
1.1 KiB
TypeScript
|
|
// app/router.options.ts
|
||
|
|
// 统一的滚动位置记忆:返回上一页时尽量还原用户滚动,而不是总是回到顶部
|
||
|
|
import type { RouterConfig } from '@nuxt/schema'
|
||
|
|
|
||
|
|
const KEY = (path: string) => `scroll:${path}`
|
||
|
|
|
||
|
|
export default <RouterConfig>{
|
||
|
|
scrollBehavior(to, from, savedPosition) {
|
||
|
|
// 工具:读取为某个路径记录的滚动位置
|
||
|
|
const getStoredPosition = (path?: string) => {
|
||
|
|
if (!process.client || !path) return null
|
||
|
|
try {
|
||
|
|
const raw = sessionStorage.getItem(KEY(path))
|
||
|
|
if (!raw) return null
|
||
|
|
const pos = JSON.parse(raw)
|
||
|
|
if (typeof pos?.left === 'number' && typeof pos?.top === 'number') {
|
||
|
|
return { left: pos.left, top: pos.top }
|
||
|
|
}
|
||
|
|
} catch (err) {
|
||
|
|
console.warn('[scroll] restore failed', err)
|
||
|
|
}
|
||
|
|
return null
|
||
|
|
}
|
||
|
|
|
||
|
|
// 优先使用我们持久化的滚动位置;没有再退回浏览器的 savedPosition
|
||
|
|
const stored = getStoredPosition(to?.fullPath)
|
||
|
|
if (stored) return stored
|
||
|
|
|
||
|
|
if (savedPosition) return savedPosition
|
||
|
|
|
||
|
|
return { left: 0, top: 0 }
|
||
|
|
}
|
||
|
|
}
|