UNPKG

@tanstack/vue-router

Version:

Modern and scalable routing for Vue applications

60 lines 2.5 kB
import * as Vue from 'vue'; import { defaultGetScrollRestorationKey, escapeHtml, restoreScroll, storageKey, } from '@tanstack/router-core'; import { isServer } from '@tanstack/router-core/isServer'; import { useRouter } from './useRouter'; import { ScriptOnce } from './ScriptOnce'; /** * ScrollRestoration component for Vue. * On server: renders a ScriptOnce with scroll restoration logic. * On client during hydration: renders a matching ScriptOnce to avoid mismatch. * After mount: renders nothing. */ export const ScrollRestoration = Vue.defineComponent({ name: 'ScrollRestoration', setup() { const router = useRouter(); // Track mounted state for hydration handling const mounted = Vue.ref(false); Vue.onMounted(() => { mounted.value = true; }); return () => { // After mount, render nothing if (mounted.value) { return null; } // Check if scroll restoration is enabled if (!router.isScrollRestoring) { return null; } // Check custom scroll restoration function if (typeof router.options.scrollRestoration === 'function') { const shouldRestore = router.options.scrollRestoration({ location: router.latestLocation, }); if (!shouldRestore) { return null; } } const getKey = router.options.getScrollRestorationKey || defaultGetScrollRestorationKey; const userKey = getKey(router.latestLocation); const resolvedKey = userKey !== defaultGetScrollRestorationKey(router.latestLocation) ? userKey : undefined; const restoreScrollOptions = { storageKey, shouldScrollRestoration: true, }; if (resolvedKey) { restoreScrollOptions.key = resolvedKey; } // Server-side: render the actual scroll restoration script if (isServer ?? router.isServer) { return (<ScriptOnce children={`(${restoreScroll.toString()})(${escapeHtml(JSON.stringify(restoreScrollOptions))})`}/>); } // Client-side during hydration: render empty ScriptOnce to match server structure return <ScriptOnce children=""/>; }; }, }); //# sourceMappingURL=scroll-restoration.jsx.map