import $ from 'jquery' import { event } from '../utils' import toTopButton from '../components/shared/to-top-button.vue' /** * Add a "infinite scroll" functionality to any component using this mixin. * Such a component should have a `scrolling` method bound to `scroll` event on * the wrapper element: @scroll="scrolling" */ export default { components: { toTopButton }, data () { return { numOfItems: 30, // Number of currently loaded and displayed items perPage: 30, // Number of items to be loaded per "page" showBackToTop: false } }, methods: { scrolling (e) { // Here we check if the user has scrolled to the end of the wrapper (or 32px to the end). // If that's true, load more items. if (e.target.scrollTop + e.target.clientHeight >= e.target.scrollHeight - 32) { this.displayMore() } this.showBackToTop = e.target.scrollTop > 64 }, /** * Load and display more items into the scrollable area. */ displayMore () { this.numOfItems += this.perPage }, /** * Scroll to top of the wrapper. */ scrollToTop () { $(this.$refs.wrapper).animate({ scrollTop: 0 }, 500) this.showBackToTop = false } }, created () { event.on('koel:teardown', () => { this.numOfItems = 30 this.showBackToTop = false }) } }