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