Почему scrollIntoView не работает в Vue 3, хотя я могу получить ссылку на элемент, к которому я пытаюсь прокрутить

У меня есть компонент Vue 3, который я пытаюсь настроить в качестве навигации для одностраничного приложения. Когда пользователь нажимает на элемент, я хочу, чтобы страница прокручивалась до элемента, содержащего контент для этого раздела.

Странно то, что я могу получить ссылку на div с помощью document.querySelector. Я могу записать div в консоль, однако, когда я пытаюсь вызвать scrollIntoView на div, он ничего не делает, если я не заключу element.scrollIntoView в функцию setTimeout.

Я уверен, что это как-то связано с жизненным циклом компонента Vue. Я пробовал обернуть свой код функцией onMounted, и это только привело к тому, что моя функция scrollPageTo выпала из области видимости.

<template>
    <div id="navigation-view" class="navigation-bar bg-gradient-to-tr w-full mx-auto flex items-start py-4">
        <div class="w-full mx-auto text-right">
                <nav>
                    <a class="top-nav-item" href="#" v-on:click="scrollPageTo('home-view')">
                        <i class="fa fa-home fa-lg"></i> Home
                    </a>

                    <a class="top-nav-item" href="#" v-on:click="scrollPageTo('hello-view')">
                        <i class="fa fa-hands-helping fa-lg"></i> Hello
                    </a>

                    <a class="top-nav-item" href="#" v-on:click="scrollPageTo('contact-view')">
                        <i class="fa fa-envelope fa-lg"></i> Contact
                    </a>
                </nav>
        </div>
    </div>
    <div class="logo">
        <img src="/assets/img/615io-logo-wbg.png" alt="615io logo">
    </div>
</template>
<script lang="ts">
import {defineComponent, onMounted} from "vue";
export default defineComponent({
    setup() {

        const scrollPageTo = (navEl) => {
            console.log(`#${navEl}`);
            let element = document.querySelector(`#${navEl}`);
            console.log(element);
            element.scrollIntoView({behavior: 'smooth'});
        }

        return {
            scrollPageTo,
        }


    }
});
</script>

person mattwallace    schedule 29.09.2020    source источник
comment
Привет, я тоже новичок в Vue 3, но вроде работает нормально. jsfiddle.net/r1xbej3d   -  person User 28    schedule 29.09.2020
comment
@ User28 хороший пример, но это не сработает, если вы используете a вместо button, но если вы добавите модификатор предотвращения, он работает   -  person Boussadjra Brahim    schedule 29.09.2020
comment
О, ты прав, я не заметил, что в коде OP используется тег a.   -  person User 28    schedule 29.09.2020


Ответы (1)


Добавьте модификатор prevent к событию щелчка, потому что этот модификатор предотвращает поведение по умолчанию, которое представляет собой переход к #:

v-on:click.prevent="scrollPageTo('home-view')"

Живая демонстрация

person Boussadjra Brahim    schedule 29.09.2020