<template>
<div class="xtx-infinite-loading" ref="target">
<div class="loading" v-if="isLoading">
<span class="img"></span>
<span class="text">正在加载...</span>
</div>
<div class="none" v-if="isFinished">
<span class="img"></span>
<span class="text">亲,没有更多了</span>
</div>
</div>
</template>
<script>
import { useIntersectionObserver } from '@vueuse/core'
import { ref } from 'vue'
export default {
name: 'XtxInfiniteLoad',
props: {
// 是否在加载中
isLoading: {
type: Boolean,
default: false
},
// 是否已经加载完毕
isFinished: {
type: Boolean,
default: false
}
},
emit: ['load'],
setup (props, { emit }) {
const target = ref(null)
// stop是一个可执行的方法 调用就会停止监听
// 不管元素进入还是离开市口区域,都不会在执行回调函数
useIntersectionObserver(
// 监听的目标元素
target,
// isIntersecting布尔值 代表当前监听的元素是否进入视口区域
([{ isIntersecting }], observerElement) => {
// 判断isIntersecting是不是为true,如果为true的话立刻发送ajax请求
if (isIntersecting) {
// 开始加载下一页
// 将来加载更多组件会作为list组件的子组件使用
// 父子通信: 加载下一页的时机是在子组件 加载数据的方法是在父组件
// 子组件中满足条件之后通知父组件 子传父 自定义事件 emit()
// 额外条件:必须不在加载中 并且还没有全部加载完毕 才去触发事件
if (props.isLoading === false && props.isFinished === false) {
emit('load')
}
}
},
{ threshold: 0 }
)
return {
target
}
}
}
</script>