Блог
  • Начало
  • Обо мне
  • Обратная связь

Скроллинг к компоненту в Vue.js

Дата и время: 10 августа 2018 г. 15:49 | Категория: Vue.js

В этой статье мы рассмотрим простейший способ прокрутки к HTML элементу с помощью JavaScript, оформленный в виде Vue.js компонента.

Для решения задачи мы воспользуемся относительно новым экспериментальным API, а именно методом Element.scrollIntoView(). Несмотря на то, что API экспериментальный, самая базовая его поддержка есть даже в IE8 (список поддерживаемых браузеров).

Создадим новый Single File Component в файле ScrollToComponent.vue:

<template>
</template>

<script>
export default {
    name: 'scroll-to-component',
};
</script>
По задумке автора, этот компонент должен оборачивать любой участок кода и позволять по какому-либо событию прокрутить страницу к этому участку. Чтобы иметь возможность помещать HTML внутри компонента, добавим элемент slot внутри его шаблона:
<template>
    <slot/>
</template>
Теперь необходимо каким-то образом вывать ранее упомянутый метод Element.scrollIntoView() на содержимом компонента. Так как slot не является HTML элементом, требуется поместить его в какой-либо HTML элемент, например, span. Для нового элемента создадим ссылку (ref="component"), чтобы можно было к нему обраться в методе компонента scrollTo():
<template>
    <span ref="component">
        <slot/>
    </span>
</template>

<script>
export default {
    name: 'scroll-to-component',
    methods: {
        scrollTo () {
            this.$refs.component.scrollIntoView();
        },
    },
};
</script>
На данном этапе мы получили самую базовую версию компонента. Он уже будет выполнять свою основную функцию, но его можно улучшить путём добавление возможности передачи параметров скроллинга (подробности о которых можно узнать по ссылке в начале статьи) через свойста компонента:
<template>
    <span ref="component">
        <slot/>
    </span>
</template>

<script>
export default {
    name: 'scroll-to-component',
    props: {
        alignToTop: {
            required: false,
            default: null,
            type: Boolean,
        },
        options: {
            required: false,
            default: null,
            type: Object,
        },
    },
    methods: {
        scrollTo () {
            this.$refs.component.scrollIntoView(this.options !== null ? this.options : this.alignToTop);
        },
    },
};
</script>
Данный компонент внутри какого-то другого можно использовать следующим образом:
<template>
    <div>
        <button @click="scroll">Scroll to Element</button>
        <div style="height: 2000px;"/>
        <scroll-to-component ref="element">
            <h1>Element</h1>
        </scroll-to-component>
    </div>
</template>

<script>
import ScrollToComponent from "ScrollToComponent.vue";

export default {
    name: 'another-component',
    components: {
        ScrollToComponent,
    },
    methods: {
        scroll () {
            this.$refs.element.scrollTo();
        },
    },
};
</script>

comments powered by Disqus
Select language:
  • Русский
  • English

  • Программирование

    Python C++ JavaScript

    Веб-разработка

    Django ASP.NET

    Мобильная разработка

    Windows Phone Android

    Разработка игр

    Unity3d Blender

    Артем Устимов © 2014