写过小程序或者uni-app的前端朋友们,肯定了解过onReachBottom触底加载更多函数,当页面滑动到最底部的时候加载更多内容。
现有一需求:封装一个组件符合高内聚、低耦合原则,实现触底加载更多回调。
技术选型:调研最快捷简单的实现方式是使用H5 的IntersectionObserver API,且各大浏览器都早已做了兼容。
其原理是监听元素是否出现在视窗内,当元素可见的时候触发回调函数
js
const intersectionObserver = new IntersectionObserver((entries) => {
// 如果 intersectionRatio 为 0,则目标在视野外,
// 我们不需要做任何事情。
if (entries[0].intersectionRatio <= 0) return;
loadItems(10);
console.log("Loaded new items");
});
// 开始监听
intersectionObserver.observe(document.querySelector(".scrollerFooter"));
代码封装:
xml
<template>
<view id="showMoreData" class="load-more">
加载更多...
</view>
</template>
<script>
export default {
data() {
return {
intersectionObsever: null
}
},
props: {
loadStatus: {
type: String,
default: 'loadmore' //loading、loadmore、nomore
}
},
methods: {
listenViewInDevice() {
let me = this;
this.intersectionObsever= new IntersectionObserver(function (entries) {
if (entries[0].intersectionRatio > 0) {
if(me.loadStatus == 'loadmore') {
me.$emit('loadMore')
}
}
});
this.intersectionObsever.observe(document.querySelector("#showMoreData"));
},
},
mounted() {
this.listenViewInDevice();
},
beforeDestroy(){
this.intersectionObsever.disonnect();
},
activated() {
this.listenViewInDevice();
},
deactivated() {
this.intersectionObsever.disonnect();
}
}
</script>
<style scoped lang='scss'>
.load-more {
width: 100%;
display: flex;
justify-content: 'center';
height: 80rpx;
}
</style>
为避免keep-alive导致页面被缓存,使用activated和deactivated来创建和销毁实例。
觉得文章对您有帮助的话,麻烦点个赞吧,谢谢~🙏