Ant design Select 带分页组件

/**
 * 分页下拉选择器组件
 */
import * as React from 'react';

import { Divider, Select, Pagination } from 'antd';

type PaginationType = {
  // 总条数
  totalElements: number;
  // 总页数
  totalPages?: number;
  // 每页大小
  pageSize?: number;
};

type PaginationSelectType = {
  pagination: PaginationType;
  request: (page: number, size: number) => void;
  width?: number | string;
  value?: string;
  onChange?: (value: any) => void;
  fieldProps: { options: any[]; [key: string]: any };
};

/**
 * |---------------------------------select 带分页组件----------------------------------|
 * |-------------1、支持除onChange、dropdownRender、value外的所有select属性
 * |-------------2、调用select默认属性,同pro-components,使用filedProps:{xx:xx}
 * |-------------3、分页默认是每页大小为8,当所给数据超过分页大小8时会被当做全部数据,此时将组件将接管分页功能,
 * 不在发送请求获取数据(设置了每页大小,则以实际为准)
 */
const Index = ({
  value,
  onChange,
  pagination,
  request,
  width = '100%',
  fieldProps = { options: [] },
}: PaginationSelectType) => {
  const [selectVal, setSelectVal] = React.useState<string | string[]>();
  const [current, setCurrent] = React.useState<number>(1);
  const [totalPages] = React.useState<number>(Math.ceil(pagination.totalElements / 8));
  const [options, setOptions] = React.useState(
    fieldProps?.options.slice(0, pagination?.pageSize || 8),
  );
  return (
    <Select
      value={value || selectVal}
      style={{ width: width }}
      onChange={(newVal) => {
        setSelectVal(newVal);
        onChange?.(newVal);
      }}
      dropdownRender={(menu) => (
        <>
          {menu}
          {totalPages > 1 && <Divider style={{ margin: '8px 0' }} />}
          <div style={{ padding: '0 8px 4px 4px', display: 'flex', justifyContent: 'flex-end' }}>
            {(width >= 240 || width === '100%') && totalPages > 1 && (
              <span>总共 {pagination?.totalElements} 条</span>
            )}
            <Pagination
              simple
              size="small"
              current={current}
              pageSize={pagination?.pageSize || 8}
              hideOnSinglePage={true}
              showSizeChanger={false}
              total={pagination?.totalElements || 0}
              onChange={(page, size) => {
                setCurrent(page);
                if (fieldProps.options.length > (pagination?.pageSize || 8)) {
                  setOptions(
                    fieldProps?.options.slice(
                      page * (pagination?.pageSize || 8) - (pagination?.pageSize || 8),
                      page * (pagination?.pageSize || 8),
                    ),
                  );
                } else {
                  request(page - 1, size);
                }
              }}
            />
          </div>
        </>
      )}
      {...{ ...fieldProps, options: options }}
    ></Select>
  );
};

export default Index;
posted @   沐雨辰沨  阅读(743)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2021-09-09 hbuilder检测不到夜神模拟器
2020-09-09 JavaScript——for循环
2020-09-09 迭代器
2020-09-09 DOM外联样式相关操作
点击右上角即可分享
微信分享提示