scrollBehaviour.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // see https://github.com/vuejs/vue-router-next/blob/master/playground/scrollWaiter.ts
  2. import type { RouteLocationNormalized } from 'vue-router';
  3. // class ScrollQueue {
  4. // private resolve: (() => void) | null = null;
  5. // private promise: Promise<any> | null = null;
  6. // add() {
  7. // this.promise = new Promise((resolve) => {
  8. // this.resolve = resolve as () => void;
  9. // });
  10. // }
  11. // flush() {
  12. // this.resolve && this.resolve();
  13. // this.resolve = null;
  14. // this.promise = null;
  15. // }
  16. // async wait() {
  17. // await this.promise;
  18. // }
  19. // }
  20. // const scrollWaiter = new ScrollQueue();
  21. /**
  22. * Handles the scroll behavior on route navigation
  23. *
  24. * @param {object} to Route object of next page
  25. * @param {object} from Route object of previous page
  26. * @param {object} savedPosition Used by popstate navigations
  27. * @returns {(object|boolean)} Scroll position or `false`
  28. */
  29. // @ts-ignore
  30. export async function scrollBehavior(to, from, savedPosition) {
  31. // await scrollWaiter.wait();
  32. // Use predefined scroll behavior if defined, defaults to no scroll behavior
  33. const behavior = 'smooth';
  34. // Returning the `savedPosition` (if available) will result in a native-like
  35. // behavior when navigating with back/forward buttons
  36. if (savedPosition) {
  37. return { ...savedPosition, behavior };
  38. }
  39. // Scroll to anchor by returning the selector
  40. if (to.hash) {
  41. return { el: decodeURI(to.hash), behavior };
  42. }
  43. // Check if any matched route config has meta that discourages scrolling to top
  44. if (to.matched.some((m: RouteLocationNormalized) => m.meta.scrollToTop === false)) {
  45. // Leave scroll as it is
  46. return false;
  47. }
  48. // Always scroll to top
  49. return { left: 0, top: 0, behavior };
  50. }