Creating ft-intersection-observer component (#571)
* Created ft-intersection-observer component. * Improved first run logic.
This commit is contained in:
parent
9bd097fa47
commit
9a453f2e37
|
@ -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')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,5 @@
|
||||||
|
<template>
|
||||||
|
<div ref="elem" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script src="./ft-intersection-observer.js" />
|
Loading…
Reference in New Issue