ZBLOG

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

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

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

示例代码

import React, { useState } from 'react';
import { Select, Spin, Pagination } from 'antd';

const { Option } = Select;

const PAGE_SIZE = 20; // 每页加载的数据条数

const PaginatedSelectWithPagination = () => {
    const [options, setOptions] = useState([]);
    const [loading, setLoading] = useState(false);
    const [totalOptions, setTotalOptions] = useState(0); // 总数据量
    const [currentPage, setCurrentPage] = useState(1);
    const [searchTerm, setSearchTerm] = useState('');

    // 模拟 API 请求来获取选项数据
    const fetchOptions = async (page) => {
        setLoading(true);
        try {
            // 替换为实际的 API 请求
            const newOptions = await fetchMockData(searchTerm, page, PAGE_SIZE);
            if (page === 1) {
                setTotalOptions(newOptions.total); // 更新总数据量
                setOptions(newOptions.data); // 设置新请求返回的数据
            } else {
                setOptions((prev) => [...prev, ...newOptions.data]); // 加载更多数据
            }
        } catch (error) {
            console.error(error);
        } finally {
            setLoading(false);
        }
    };

    const handleSearch = (value) => {
        if (!value) return;
        
        setSearchTerm(value); // 保存搜索词
        setCurrentPage(1); // 重置当前页码为1
        
        fetchOptions(1); // 请求第一页数据
    };

    const handlePageChange = (page) => {
        setCurrentPage(page); // 更新当前页码
        fetchOptions(page); // 根据新的页码请求数据
    };

  	// 模拟 API 数据获取函数,这里假设 total 为模拟的总记录数 
	const fetchMockData = async (searchTerm, page, size) => {
    	return new Promise((resolve) => {
        	setTimeout(() => {
            	const totalRecords = 100; // 假设有100条总记录
            	const data = Array.from({ length: size }, (_, index) => ({
                	value: `${searchTerm}-${page}-${index}`,
                	label: `${searchTerm} Option ${page}-${index}`,
            	}));

            	resolve({
                	data,
                	total: totalRecords,
            	});
        	}, 1000);
    	});
	};

  	return (
      <div>
          <Select 
              showSearch 
              filterOption={false}
              onSearch={handleSearch}
              style={{ width: '200px', marginBottom: '16px' }}
          >
              {options.map(option => (
                  <Option key={option.value} value={option.value}>
                      {option.label}
                  </Option>
              ))}
              {loading && (
                  <Option disabled>
                      <Spin size="small" />
                  </Option>
              )}
          </Select>
          <Pagination 
              current={currentPage} 
              total={totalOptions} 
              pageSize={PAGE_SIZE} 
              onChange={handlePageChange} 
          />
      </div>
   );
};

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

注册

已经有帐号?