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

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.xdnf.cn/news/17120.html

相关文章:

  • vcpkg: 一款免费开源的C++包管理器
  • 计算机网络:如何判断B或者C类IP地址是否划分了子网
  • 基于Hadoop的木鸟民宿数据分析与可视化、民宿价格预测模型系统的设计与实现
  • CAN通信
  • 解决Node.js v12在Apple Silicon(M1/M2)上的安装问题
  • 使用R将nc文件转换为asc文件或者tif文件
  • 下载Android studio
  • try catch throw的本质
  • Linux《进程间通信(上)》
  • WARN:get Topic [TBW102] RouteInfoFromNameServer is not exist value
  • 使用MatterJs物理2D引擎实现重力和鼠标交互等功能,有点击事件(盒子堆叠效果)
  • [Oracle] NVL()函数
  • 测试单节点elasticsearch配置存储压缩后的比率
  • 河南萌新联赛2025第(四)场【补题】
  • 8月6日星期三今日早报简报微语报早读
  • JAVA无人系统台球茶室棋牌室系统支持H5小程序APP公众号源码
  • 基于跨境电商场景的智能商品管理系统,采用Bootstrap+Django+MySQL技术架构,实现用户行为追踪、智能推荐、多维度商品展示等核心功能
  • 8、项目管理
  • JAVA 程序员cursor 和idea 结合编程
  • Solidity 编程进阶
  • 8.6 JavaWeb(请求响应 P67-P74)
  • PyTorch入门引导
  • Go语言“fmt”包详解
  • 【Linux内核系列】:信号(上)
  • Docker的安装,服务器与客户端之间的通信
  • LeetCode每日一题,8-6
  • springboot项目justAuth扩展第二个小程序
  • Unity轻量观察相机
  • 功能安全和网络安全的综合保障流程
  • 云端软件工程智能代理:任务委托与自动化实践全解