当前位置: 首页 > news >正文

antd组件select下拉数据分页加载

import React, { useState, useRef, useCallback } from "react";
import { Select, Spin } from "antd";const { Option } = Select;
const PAGE_SIZE = 20;// 模拟接口
const fetchUsers = (q, page) =>new Promise((resolve) => {setTimeout(() => {const total = 100; // 假设总条数const start = (page - 1) * PAGE_SIZE;const list = Array.from({ length: Math.min(PAGE_SIZE, total - start) },(_, i) => ({id: start + i + 1,name: `${q || "User"} ${start + i + 1}`,}));resolve({ list, hasMore: start + list.length < total });}, 600);});// 防抖工具
const debounce = (fn, delay) => {let timer;return (...args) => {clearTimeout(timer);timer = setTimeout(() => fn(...args), delay);};
};const RemoteSelect = () => {const [data, setData] = useState([]);const [value, setValue] = useState([]);const [loading, setLoading] = useState(false);const [hasMore, setHasMore] = useState(true);const [query, setQuery] = useState("");const pageRef = useRef(1);const fetchingRef = useRef(false);// 加载数据const loadData = useCallback(debounce(async (q, page, concat = false) => {if (fetchingRef.current) return;fetchingRef.current = true;setLoading(true);const { list, hasMore: more } = await fetchUsers(q, page);setData((prev) => (concat ? [...prev, ...list] : list));setHasMore(more);setLoading(false);fetchingRef.current = false;}, 300),[]);// 搜索时重置const handleSearch = (q) => {setQuery(q);pageRef.current = 1;setHasMore(true);loadData(q, 1);};// 滚动到底部加载更多const handlePopupScroll = (e) => {const { target } = e;if (hasMore &&!loading &&!fetchingRef.current &&target.scrollTop + target.clientHeight === target.scrollHeight) {pageRef.current += 1;loadData(query, pageRef.current, true);}};return (<Selectmode="multiple"placeholder="请输入关键字搜索"value={value}onChange={setValue}filterOption={false}onSearch={handleSearch}onPopupScroll={handlePopupScroll}notFoundContent={loading ? <Spin size="small" /> : null}style={{ width: 300 }}>{data.map((user) => (<Option key={user.id} value={user.id}>{user.name}</Option>))}{loading && hasMore && (<Option disabled><Spin size="small" /></Option>)}</Select>);
};export default RemoteSelect;

使用

import React from 'react';
import ReactDOM from 'react-dom';
import RemoteSelect from './RemoteSelect';ReactDOM.render(<RemoteSelect />, document.getElementById('root'));

http://www.lryc.cn/news/612503.html

相关文章:

  • LeetCode 分类刷题:611. 有效三角形的个数
  • 【前端】Vite中import.meta功能详解
  • 深度修改elementUI样式思路
  • 《Day2-PyTorch Tensor 从入门到实践:核心操作与避坑指南》
  • 磁悬浮转子变转速工况下的振动抑制全解析
  • Conditional Modeling Based Automatic Video Summarization
  • 云平台托管集群:EKS、GKE、AKS 深度解析与选型指南-第二章
  • [Python 基础课程]猜数字游戏
  • HIVE 窗口函数处理重复数据
  • 【C/C++】形参、实参相关内容整理
  • GISBox中OSGB数据转3DTiles格式指南
  • 开源流媒体服务器ZLMediaKit 的Java Api实现的Java版ZLMediaKit流媒体服务器-二开视频对话
  • java 之 继承
  • 【Java】HashMap的key可以为null吗?如何存储的?
  • JavaScript 基础语法
  • TDengine IDMP 背后的技术三问:目录、标准与情景
  • TCP的三次握手和四次挥手实现过程。以及为什么需要三次握手?四次挥手?
  • 8、项目管理
  • 力扣 hot100 Day67
  • 二、Envoy静态配置
  • CentOS8.5安装19c单机告警及处理
  • CS课程项目设计8:基于Canvas支持AI人机对战的五子棋游戏
  • LeetCode 面试经典 150_数组/字符串_O(1)时间插入、删除和获取随机元素(12_380_C++_中等)(哈希表)
  • Linux firewall 防火墙管理
  • Linux systemd 系统管理:systemctl 控制服务与守护进程
  • 深入理解 qRegisterMetaType<T>()
  • 【数据可视化-82】中国城市幸福指数可视化分析:Python + PyEcharts 打造炫酷城市幸福指数可视化大屏
  • JAVA算法练习题day9
  • 蓝桥杯----锁存器、LED、蜂鸣器、继电器、Motor
  • Pytest项目_day06(requests中Session的用法)