Почему не происходит прокрутка страницы до якоря?

Vue приложение, используется роутер, mode: 'history' На главной странице перебором массива отрисовываются router-link с :to="{path: '/page', hash: '#'+item}"

На другой странице содержатся компоненты с обычным текстом. В начале каждого текста заголовок с id с соответствующим значением item из ссылки, что отрисовываются на главной.

При клике по ссылке, происходит переход на другую страницу (/page), а вот прокрутка до расположения "якоря" не происходит. Точнее, страница прокручивается лишь до середины.

Если же ссылки расположена на самой другой странице, например вверху, то переход по "якорям" происходит (прокрутка до их расположения).

Предполагаю, что это связано с тем, что содержимое компонентов не успевает отобразиться (заполнить пространство на странице определенной высоты, равной содержимому компонента) к моменту срабатывания прокрутки до "якоря". Так же пробовал в роутер добавлять метод scrollBehavior, изменений не наблюдалось.

Буду благодарен за любые предложения реализации данной задачи.


Ответы (3 шт):

Автор решения: mccrush

В итоге помогли две вещи:

  1. В файле router оставил метод
scrollBehavior() {
    return { x: 0, y: 0 }
  }

чтобы при любых переходах страница отображалась сверху;

  1. На самой странице (/page) в mounted() написал
let elem = document.querySelector(this.$route.hash)
elem.scrollIntoView({ block: 'start', behavior: 'smooth' })

чтобы страница прокручивалась до места расположения "якоря".

Но все же странно, что решение в документации ко vue-router не захотело у меня работать...

scrollBehavior(to, from, savedPosition) {
    if (to.hash) {
      return { selector: to.hash }
    } else {
      return { x: 0, y: 0 }
    }
  }
→ Ссылка
Автор решения: Михаил Докучаев

Столкнулся с похожей проблемой. В моем случае ответ оказался прост. В Vue Router 4 формат возвращаемого объекта из scrollBehavior() изменился по сравнению с тем, что было в Vue Router 3. В частности, свойство объекта selector теперь называется el, как показано в документах:

    scrollBehavior(to, from, savedPosition) {
        if (to.hash) {
            return ({
                el: to.hash,
                behavior: 'smooth',
            })
        } else if (savedPosition) {
            return (savedPosition);
        } else {
            return {left: 0, top: 0}
        }
    },
→ Ссылка