select下拉框---无限滚动加载

需求: select的下拉框,后端做了分页,此时前段需要同步加分页
解决思路: 考虑到交互和性能,采用触底请求下一页(无限滚动加载)

代码示例:

import { Select, message } from 'antd';
import React, { useEffect, useState } from 'react';

const App: React.FC = () => {
  const [selectArr, setSelectArr] = useState([]); //下拉框数组
  const [loading, setLoading] = useState(false); //加载loading
  const [hasMore, setHasMore] = useState(true); //是否还有更多数据需要加载
  const PAGE_SIZE = 10; //每页数量
  const [page, setPage] = useState(1); //当前页,默认第一页开始

  //数据处理/下一页/是否继续请求
  const getSelectArr = () => {
    if (loading || !hasMore) {
      return;
    }
    setLoading(true);
    try {
      const {success,data,errorMsg}=await getSelectArrApi() //api请求
      const errorMsg = null;
      if (success) {
        setSelectArr((prevData) => [...prevData, ...data]); // 更新数据(eg:第二页和第一页合并数组,第三页和前两页合并...)
        setPage(page + 1); //更新为下一个(eg:第一页变成请求第二页,再第三页..,以此类推...)
        setHasMore(data.length === PAGE_SIZE); //对比,当返回的新数组长度小于pagesize,则说明,数据已经全部拿到; 反之说明,还有下一页
      } else {
        message.error(errorMsg);
      }
      setLoading(false);
    } catch (err) {
      console.error(err);
    }
  };

  //滚动时操作函数
  const handleScroll = (event) => {
    //scrollTop:获取或设置一个元素的内容垂直滚动的像素数。
    //scrollHeight:一个元素内容高度的度量,包括由于溢出导致的视图中不可见内容。
    //clientHeight:元素内部的高度(单位像素),包含内边距,但不包括水平滚动条、边框和外边距。
    const { scrollTop, scrollHeight, clientHeight } = event.target;
    if (scrollHeight - (scrollTop + clientHeight) < 100) {
      //滚动加载
      getSelectArr();
    }
  };

  useEffect(() => {
    getSelectArr();
  });

  return (
    <Select
      showSearch
      placeholder="选择查询的名称"
      optionFilterProp="children"
      onChange={(value: string) => console.log(`selected ${value}`)}
      onSearch={(value: string) => console.log('search:', value)}
      filterOption={(input, option) =>
        (option?.label ?? '').toLowerCase().includes(input.toLowerCase())
      }
      options={
        Array.isArray(selectArr) &&
        selectArr?.map((item) => {
          return {
            key: item.id,
            label: item.name,
            value: item.id,
          };
        })
      }
      virtual={true}
      onPopupScroll={(e) => handleScroll(e)}
    />
  );
};

export default App;

代码示例讲解

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值