fix(nuxt): pass from + savedPosition to first scrollBehavior (#20859)

This commit is contained in:
Daniel Roe 2023-05-16 10:55:13 +01:00 committed by GitHub
parent cdc42d0449
commit a0583ba96e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,7 +1,8 @@
import { computed, isReadonly, reactive, shallowRef } from 'vue' import { computed, isReadonly, reactive, shallowRef } from 'vue'
import type { Ref } from 'vue' import type { Ref } from 'vue'
import type { RouteLocation, Router } from '#vue-router' import type { RouteLocation, Router, RouterScrollBehavior } from '#vue-router'
import { import {
START_LOCATION,
createMemoryHistory, createMemoryHistory,
createRouter, createRouter,
createWebHashHistory, createWebHashHistory,
@ -61,9 +62,19 @@ const plugin: Plugin<{ router: Router }> = defineNuxtPlugin({
const routes = routerOptions.routes?.(_routes) ?? _routes const routes = routerOptions.routes?.(_routes) ?? _routes
let startPosition: Parameters<RouterScrollBehavior>[2] | null
const initialURL = process.server ? nuxtApp.ssrContext!.url : createCurrentLocation(routerBase, window.location) const initialURL = process.server ? nuxtApp.ssrContext!.url : createCurrentLocation(routerBase, window.location)
const router = createRouter({ const router = createRouter({
...routerOptions, ...routerOptions,
scrollBehavior: (to, from, savedPosition) => {
if (from === START_LOCATION) {
startPosition = savedPosition
return
}
// reset scroll behavior to initial value
router.options.scrollBehavior = routerOptions.scrollBehavior
return routerOptions.scrollBehavior?.(to, START_LOCATION, startPosition || savedPosition)
},
history, history,
routes routes
}) })
@ -190,9 +201,11 @@ const plugin: Plugin<{ router: Router }> = defineNuxtPlugin({
try { try {
await router.replace({ await router.replace({
...router.resolve(initialURL), ...router.resolve(initialURL),
name: undefined, // #4920, #$4982 name: undefined, // #4920, #4982
force: true force: true
}) })
// reset scroll behavior to initial value
router.options.scrollBehavior = routerOptions.scrollBehavior
} catch (error: any) { } catch (error: any) {
// We'll catch middleware errors or deliberate exceptions here // We'll catch middleware errors or deliberate exceptions here
await nuxtApp.runWithContext(() => showError(error)) await nuxtApp.runWithContext(() => showError(error))