vue,移动端滚动条触底加载更多

本文介绍了一个基于Vue的无限滚动组件的实现方式,包括配置参数、核心滚动逻辑及使用示例。通过设置不同的参数,可以轻松地在页面或指定容器内实现平滑的数据加载效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置参数

const scrollProps = {
  threshold: { default: 0, type: Number },
  hasMore: { default: false, type: Boolean },
  loadMoreFn: { default: () => { }, type: Function },
  el: { default: null, type: String },
}

参数说明:
threshold:到达底部多少距离的时候开始请求数据,
hasMore:是否还需要请求
loadMoreFn: 发起请求的函数
el: 限制在el元素内部滚动,如果不传el,则默认浏览器滚动条

核心滚动

判断是否有传入el,如果有的话就将scroll绑定到el的滚动事件,如果没有则直接绑定到window的滚动事件

if (props.el) {
   nextTick(() => {
     const el = document.querySelector(props.el)
     if (el) {  el.addEventListener("scroll", (e) => { scroll() })  }
   })
 } else {
   window.onscroll = scroll
 }

scroll函数,支持异步,

async function scroll(e) {
      let el = document.body
      if (props.el) {
        el = document.querySelector(props.el)
      }
      const threshold = props.threshold || 10;
      let scrollTop = props.el ? el.scrollTop : (el.scrollTop || document.documentElement.scrollTop || window.pageXOffset);
      const docHeight = el.scrollHeight - (props.el ? el.offsetHeight : window.innerHeight)

      if ((docHeight <= (scrollTop + threshold)) && props.hasMore) {
      // 防止滚动过程中重复触发请求
        if (!doing) {
          doing = 'loading'
          const d = await props.loadMoreFn()
          setTimeout(() => {
            doing = d;
          }, 100);
        }
      }
    }

代码中使用:

 <!--document滚动-->
<div v-for="item in List" :key="item" style="padding:2rem .2rem;border-bottom:1px solid #ccc">{{item}}</div>
<infinite-scroll :loadMoreFn="loadMoreFn" :hasMore="hasMore" />

<!---容器中滚动--->
<div id="box" style="height:5rem;overflow-y:auto">
  <div v-for="item in List" :key="item" style="padding:20px 10px;border-bottom:1px solid #ccc">{{item}}</div>
  <infinite-scroll el="#box" :loadMoreFn="loadMoreFn" :hasMore="hasMore" />
</div>
 
<script>
async function loadMoreFn() {
  console.log('loadMore');
  const ret = await GetApi(state.PageIndex)
  state.hasMore = ret.length > 0;
  state.List = [...state.List, ...ret]
  state.PageIndex = state.PageIndex + 1
}
</script>

效果图如下:
在这里插入图片描述

在这里插入图片描述

源码

案例以及源码请戳这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值