diff --git a/packages/nuxt/src/pages/runtime/page.ts b/packages/nuxt/src/pages/runtime/page.ts index 722c177ee4..19bbc795b4 100644 --- a/packages/nuxt/src/pages/runtime/page.ts +++ b/packages/nuxt/src/pages/runtime/page.ts @@ -41,6 +41,7 @@ export default defineComponent({ const nuxtApp = useNuxtApp() const pageRef = ref() const forkRoute = inject(PageRouteSymbol, null) + let previousPageKey: string | undefined | false expose({ pageRef }) @@ -88,6 +89,10 @@ export default defineComponent({ } const key = generateRouteKey(routeProps, props.pageKey) + if (!nuxtApp.isHydrating && !hasChildrenRoutes(forkRoute, routeProps.route, routeProps.Component) && previousPageKey === key) { + nuxtApp.callHook('page:loading:end') + } + previousPageKey = key const hasTransition = !!(props.transition ?? routeProps.route.meta.pageTransition ?? defaultPageTransition) const transitionProps = hasTransition && _mergeTransitionProps([ @@ -148,3 +153,10 @@ function haveParentRoutesRendered (fork: RouteLocationNormalizedLoaded | null, n (c, i) => c.components?.default !== fork.matched[i]?.components?.default) || (Component && generateRouteKey({ route: newRoute, Component }) !== generateRouteKey({ route: fork, Component })) } + +function hasChildrenRoutes (fork: RouteLocationNormalizedLoaded | null, newRoute: RouteLocationNormalizedLoaded, Component?: VNode) { + if (!fork) { return false } + + const index = newRoute.matched.findIndex(m => m.components?.default === Component?.type) + return index < newRoute.matched.length -1 +} \ No newline at end of file