Skip to content

Instantly share code, notes, and snippets.

@jesusgoku
Created August 24, 2018 13:33
Show Gist options
  • Save jesusgoku/0c1106db95bef8c0352647703ca412c1 to your computer and use it in GitHub Desktop.
Save jesusgoku/0c1106db95bef8c0352647703ca412c1 to your computer and use it in GitHub Desktop.
InfiniteScroll component
<script>
export default {
name: 'InfiniteScroll',
template: '<div ref="el" style="height: 0;">&nbsp;</div>',
props: {
offset: {
type: Number,
default: 300,
},
},
methods: {
isElementInViewport: function(el) {
var rect = el.getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= ((window.innerHeight || document.documentElement.clientHeight) + this.offset) && /*or $(window).height() */
rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */
);
},
onVisibilityChange: function(el, callback) {
var old_visible;
return () => {
var visible = this.isElementInViewport(el);
if (visible != old_visible) {
old_visible = visible;
if (typeof callback == 'function') {
callback();
}
}
};
},
},
mounted: function() {
const el = this.$refs.el;
this.handler = this.onVisibilityChange(el, () => {
this.$emit('infinite-scroll');
});
addEventListener('DOMContentLoaded', this.handler, false);
addEventListener('load', this.handler, false);
addEventListener('scroll', this.handler, false);
addEventListener('resize', this.handler, false);
},
beforeDestroy: function() {
removeEventListener('DOMContentLoaded', this.handler);
removeEventListener('load', this.handler);
removeEventListener('scroll', this.handler);
removeEventListener('resize', this.handler);
},
};
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment