一、why?
有时候咱们需求 Select 组件中数据比较大,或许需求分页的问题,由于 antd 中并没有直接供应 Select 分页功用,咱们需求自己写。或许也有许多其他的方案,就是滚动到底部加载,其实这种仍是没有分页来的直接,分页的效果与表格类似。
二、需求的组件
- Select 组件
- Pagination 组件
这儿的 Select 有两种用法,一种是 option 的数组像的办法,一种是 Option 烘托组件的办法。
三、组件规划
- Option 运用组件的 memo 进行缓存,避免重复烘托。
- type 规划为两个首要组件服务,和外部的数据获取,当然也能够内部完结 ajax 请求在组件内部完结数据获取。
- 运用 dropdownRender 烘托 Select 和 Pagination 两个部分。
四、手动完结
import { Select, Pagination } from "antd";
import { memo, useMemo, useState } from "react";
function OptionComImpl({ data }: any) {
return (
<div>
{data.map((item: any, index: number) => {
return <Select.Option value={item.value} key={index}>{item.label}</Select.Option>;
})}
</div>
);
}
const OptionCom = memo(OptionComImpl);
type ISelectPaginationProps = {
data: any[]
currentPage: number
selectStyles: React.CSSProperties
paginationStyles: React.CSSProperties
paginationProps: any
selectPagniationProps: any
}
const _data = [
{ label: "选项 1", value: "1" },
{ label: "选项 2", value: "2" },
{ label: "选项 3", value: "3" },
{ label: "选项 4", value: "4" },
{ label: "选项 5", value: "5" },
{ label: "选项 6", value: "6" },
{ label: "选项 7", value: "7" },
{ label: "选项 8", value: "8" },
{ label: "选项 9", value: "9" },
{ label: "选项 10", value: "10" },
{ label: "选项 11", value: "11" },
{ label: "选项 12", value: "12" },
{ label: "选项 13", value: "13" },
{ label: "选项 14", value: "14" },
{ label: "选项 15", value: "15" },
{ label: "选项 16", value: "16" },
{ label: "选项 17", value: "17" },
{ label: "选项 18", value: "18" },
{ label: "选项 19", value: "19" },
{ label: "选项 20", value: "20" },
{ label: "选项 21", value: "21" },
{ label: "选项 22", value: "22" },
];
export default function SelectPagination({ data = _data, ...props }: ISelectPaginationProps) {
const [currentPage, setCurrentPage] = useState( props.currentPage || 1); // 当时页码
const [skip] = useState(10);
const dataSource = useMemo(() => {
return data.slice(
skip * (currentPage - 1),
data.length - currentPage * skip > 0 ? currentPage * skip : data.length
);
}, [currentPage, data, skip]);
return (
<div>
<Select
style={{
width: 200,
...props.selectStyles,
}}
dropdownRender={(menu, ...args) => {
return (
<div>
{menu}
<div style={{ padding: '10px 0px'}}>
<Pagination
total={data.length}
showSizeChanger
size="small"
pageSize={skip}
onChange={(page) => {
setCurrentPage(page);
}}
{...props.paginationProps}
/>
</div>
</div>
);
}}
{...props.selectPagniationProps}
>
{dataSource.map((item) => {
return <OptionCom key={item.value} data={data} />;
})}
</Select>
</div>
);
}
五、剖析
核心要知晓的点就是 dropdownRender
特点,烘托额定的内容。其间 menu
特点是不好修改的。一起咱们需求核算初始分页数据 dataSource
当然也能够依据自己的需求重新完结,所以运用组件式的分页烘托数据。运用 useMemo 核算并缓存核算结果。本示例只是一个简略的示例。
六、示例
七、小结
Select 与 Pagination 组件是一个常用的功用,由于或许 Select 中需求寄存的数据比较大,运用滚动的办法也有需求滚动好久,运用分页的办法更加的合理。本文首要评论的其间一个通用的完结办法,期望能够协助到我们。