滚动条下拉触底加载数据

滚动条下拉触底后加载数据

触底加载

  • 需求:页面下拉滚动条,容器元素触底后发起接口请求获取第二批数据(类似于懒加载)
  • 浏览器API:getBoundingClientRect,判断元素底部边界是否出现在页面视窗。
  • 注意:防抖和节流,控制触发次数

js:

import { debounce } from 'lodash';

const searchForm = reactive({
  page: 1,
  pageSize: 20,
});

const tableConfig = reactive({
  total: 0,
  tableData: [],
  hasMore: false,
});
async function getTableData() {
  try {
    const res = await getSmokeCarList(searchForm);
    const { list } = res.data;
    if (list.length < searchForm.pageSize) {
      tableConfig.hasMore = false;
    } else {
      tableConfig.hasMore = true;
    }
    tableConfig.tableData = tableConfig.tableData.concat(list);
  } catch (error) {
    console.log(error);
  }
}

// div底部出现在视窗时加载数据
const carListRef = ref();
// 使用防抖,限制触发频率
const debouncedLoadMore = debounce(() => {
  const rect = carListRef.value.getBoundingClientRect();
  // 判断元素的下边界是否在视窗内
  const isInViewport = rect.bottom > 0 && rect.bottom <= window.innerHeight;

  if (isInViewport && tableConfig.hasMore) {
    searchForm.page += 1;
    getTableData();
  }
}, 500); // 指定防抖延迟时间

onMounted(() => {
  window.addEventListener('scroll', debouncedLoadMore);
  getTableData();
});

onUnmounted(() => {
  window.removeEventListener('scroll', debouncedLoadMore);
});

html:

<div ref="carListRef" class="table-box">
	容器内容
</div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值