api-client/components/smart/Intersection.vue

37 lines
756 B
Vue
Raw Normal View History

2021-05-12 03:38:47 +00:00
<template>
<div ref="container">
2021-05-18 09:27:29 +00:00
<slot></slot>
2021-05-12 03:38:47 +00:00
</div>
</template>
<script lang="ts">
2021-05-15 12:43:31 +00:00
/*
2021-05-12 03:38:47 +00:00
Implements a wrapper listening to viewport intersections via
IntesectionObserver API
Events
------
intersecting (entry: IntersectionObserverEntry) -> When the component is intersecting the viewport
*/
import Vue from "vue"
export default Vue.extend({
data() {
return {
observer: null as IntersectionObserver | null,
}
},
mounted() {
this.observer = new IntersectionObserver(([entry]) => {
if (entry && entry.isIntersecting) {
this.$emit("intersecting", entry)
}
})
this.observer.observe(this.$refs.container as Element)
},
beforeDestroy() {
this.observer?.disconnect()
},
})
</script>