koel/resources/assets/js/mixins/infinite-scroll.js

56 lines
1.4 KiB
JavaScript
Raw Normal View History

2015-12-13 04:42:28 +00:00
import $ from 'jquery';
2016-06-25 05:24:55 +00:00
import { event } from '../utils';
import toTopButton from '../components/shared/to-top-button.vue';
2015-12-13 04:42:28 +00:00
/**
2015-12-14 03:45:15 +00:00
* 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"
2015-12-13 04:42:28 +00:00
*/
export default {
2016-06-25 16:05:24 +00:00
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;
2015-12-13 04:42:28 +00:00
},
2016-06-25 16:05:24 +00:00
/**
* Load and display more items into the scrollable area.
*/
displayMore() {
this.numOfItems += this.perPage;
2015-12-13 04:42:28 +00:00
},
2015-12-30 04:14:47 +00:00
2016-06-25 16:05:24 +00:00
/**
2016-06-26 17:15:34 +00:00
* Scroll to top of the wrapper.
2016-06-25 16:05:24 +00:00
*/
scrollToTop() {
2016-06-26 17:15:34 +00:00
$(this.$refs.wrapper).animate({ scrollTop: 0 }, 500);
2016-06-25 16:05:24 +00:00
this.showBackToTop = false;
2015-12-30 04:14:47 +00:00
},
2016-06-25 16:05:24 +00:00
},
created() {
event.on('koel:teardown', () => {
this.numOfItems = 30;
this.showBackToTop = false;
});
},
2015-12-13 04:42:28 +00:00
};