Creating ft-intersection-observer component (#571)

* Created ft-intersection-observer component.

* Improved first run logic.
This commit is contained in:
Violet Rose 2020-10-03 13:30:09 -07:00 committed by GitHub
parent 9bd097fa47
commit 9a453f2e37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 59 additions and 0 deletions

View File

@ -0,0 +1,54 @@
import Vue from 'vue'
export default Vue.extend({
name: 'FtIntersectionObserver',
props: {
checkOnMount: {
type: Boolean,
default: false
},
margin: {
type: String,
default: '0px 0px 0px 0px'
},
observeParent: {
type: Boolean,
default: false
},
threshold: {
type: Number,
default: 1
}
},
data() {
const observer = new IntersectionObserver(this.handleIntersection, {
rootMargin: this.margin,
threshold: this.threshold
})
const runOnce = false
return {
observer,
runOnce
}
},
mounted() {
this.observer.observe(this.observeParent ? this.$refs.elem.parentElement : this.$refs.elem)
},
beforeDestroy() {
this.observer.disconnect()
},
methods: {
handleIntersection(entries) {
if (!this.runOnce) {
this.runOnce = true
if (!this.checkOnMount) {
return
}
}
this.$emit(entries[0].isIntersecting ? 'intersected' : 'unintersected')
}
}
})

View File

@ -0,0 +1,5 @@
<template>
<div ref="elem" />
</template>
<script src="./ft-intersection-observer.js" />