ZBLOG

react 实现ant中的select组件当下拉框选项数据量大时数据分页加载的功能,可以结合pagination组件实现吗

当然可以!结合 Ant Design 的 Pagination 组件和 Select 组件实现下拉框选项的分页加载是一个很好的选择。这可以让用户更直观地看到当前有多少页,并且能够快速跳转到特定页面。

下面是一个示例代码,展示如何在 Ant Design 中使用 Select 组件与 Pagination 组件进行组合,实现大数据量下拉框的分页加载:

示例代码

  1. import React, { useState } from 'react';
  2. import { Select, Spin, Pagination } from 'antd';
  3. const { Option } = Select;
  4. const PAGE_SIZE = 20; // 每页加载的数据条数
  5. const PaginatedSelectWithPagination = () => {
  6. const [options, setOptions] = useState([]);
  7. const [loading, setLoading] = useState(false);
  8. const [totalOptions, setTotalOptions] = useState(0); // 总数据量
  9. const [currentPage, setCurrentPage] = useState(1);
  10. const [searchTerm, setSearchTerm] = useState('');
  11. // 模拟 API 请求来获取选项数据
  12. const fetchOptions = async (page) => {
  13. setLoading(true);
  14. try {
  15. // 替换为实际的 API 请求
  16. const newOptions = await fetchMockData(searchTerm, page, PAGE_SIZE);
  17. if (page === 1) {
  18. setTotalOptions(newOptions.total); // 更新总数据量
  19. setOptions(newOptions.data); // 设置新请求返回的数据
  20. } else {
  21. setOptions((prev) => [...prev, ...newOptions.data]); // 加载更多数据
  22. }
  23. } catch (error) {
  24. console.error(error);
  25. } finally {
  26. setLoading(false);
  27. }
  28. };
  29. const handleSearch = (value) => {
  30. if (!value) return;
  31. setSearchTerm(value); // 保存搜索词
  32. setCurrentPage(1); // 重置当前页码为1
  33. fetchOptions(1); // 请求第一页数据
  34. };
  35. const handlePageChange = (page) => {
  36. setCurrentPage(page); // 更新当前页码
  37. fetchOptions(page); // 根据新的页码请求数据
  38. };
  39. // 模拟 API 数据获取函数,这里假设 total 为模拟的总记录数
  40. const fetchMockData = async (searchTerm, page, size) => {
  41. return new Promise((resolve) => {
  42. setTimeout(() => {
  43. const totalRecords = 100; // 假设有100条总记录
  44. const data = Array.from({ length: size }, (_, index) => ({
  45. value: `${searchTerm}-${page}-${index}`,
  46. label: `${searchTerm} Option ${page}-${index}`,
  47. }));
  48. resolve({
  49. data,
  50. total: totalRecords,
  51. });
  52. }, 1000);
  53. });
  54. };
  55. return (
  56. <div>
  57. <Select
  58. showSearch
  59. filterOption={false}
  60. onSearch={handleSearch}
  61. style={{ width: '200px', marginBottom: '16px' }}
  62. >
  63. {options.map(option => (
  64. <Option key={option.value} value={option.value}>
  65. {option.label}
  66. </Option>
  67. ))}
  68. {loading && (
  69. <Option disabled>
  70. <Spin size="small" />
  71. </Option>
  72. )}
  73. </Select>
  74. <Pagination
  75. current={currentPage}
  76. total={totalOptions}
  77. pageSize={PAGE_SIZE}
  78. onChange={handlePageChange}
  79. />
  80. </div>
  81. );
  82. };
  83. export default PaginatedSelectWithPagination;

核心逻辑说明:

  1. 状态管理

    • options: 存储下拉框选项。
    • loading: 控制加载状态。
    • totalOptions: 存储从服务器获取的总选项数量,用于计算分页。
    • currentPage: 当前显示的页码。
    • searchTerm: 当前搜索关键词。
  2. fetchMockData 函数:模拟从服务器端获取选项数据,包含每一页的数据和总记录数。在实际应用中,应替换成真实的 API 调用。

  3. handleSearch 函数:用户输入时触发,重置页码并请求第一页的数据。

  4. handlePageChange 函数:当用户改变页面时更新当前页面并请求对应的数据。

  5. 渲染

    • 使用 Ant Design 的 SelectOption 来显示选项。
    • 添加了一个 Pagination 组件,根据总记录和当前页面进行渲染,允许用户切换页面。

这种方式可以很方便地处理大量选项,并提供清晰明了的分页功能,让用户体验更加流畅。请根据具体需求调整接口调用部分及其他细节。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20447

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?