diff --git a/README.md b/README.md
index f595a4d4..72bf4247 100644
--- a/README.md
+++ b/README.md
@@ -63,9 +63,9 @@ ReactDOM.render(, container);
| onChange | page change callback | Function(current, pageSize) | - |
| showSizeChanger | show pageSize changer | Bool | `false` when total less then `totalBoundaryShowSizeChanger`, `true` when otherwise |
| totalBoundaryShowSizeChanger | when total larger than it, `showSizeChanger` will be true | number | 50 |
-| pageSizeOptions | specify the sizeChanger selections | Array | ['10', '20', '50', '100'] |
-| onShowSizeChange | pageSize change callback | Function(current, size) | - |
-| showSizeOptionsSearch | when true can search in sizeChanger select | Bool | false |
+| pageSizeOptions(deprecated) | specify the sizeChanger selections | Array | ['10', '20', '50', '100'] |
+| onShowSizeChange(deprecated) | pageSize change callback | Function(current, size) | - |
+| pageSizeChanger | page size changer select options | {showSearch: boolean, options: Array, onChange: Function(current, size)} | {options: ['10', '20', '50', '100'], showSearch: false} |
| hideOnSinglePage | hide on single page | Bool | false |
| showPrevNextJumpers | show jump-prev, jump-next | Bool | true |
| showQuickJumper | show quick goto jumper | Bool / Object | false / {goButton: true} |
diff --git a/docs/examples/sizer.tsx b/docs/examples/sizer.tsx
index b3bdda0c..23cf0e46 100644
--- a/docs/examples/sizer.tsx
+++ b/docs/examples/sizer.tsx
@@ -23,22 +23,28 @@ class App extends React.Component {
selectComponentClass={Select}
showSizeChanger
pageSize={pageSize}
- onShowSizeChange={this.onShowSizeChange}
- showSizeOptionsSearch={true}
+ pageSizeChanger={{
+ onChange: this.onShowSizeChange,
+ }}
defaultCurrent={3}
total={40}
/>
diff --git a/src/Options.tsx b/src/Options.tsx
index 2a5331e5..119925d0 100644
--- a/src/Options.tsx
+++ b/src/Options.tsx
@@ -2,7 +2,7 @@ import type { SelectProps } from 'rc-select';
import type { OptionProps } from 'rc-select/es/Option';
import KEYCODE from 'rc-util/lib/KeyCode';
import React from 'react';
-import type { PaginationLocale } from './interface';
+import type { PaginationLocale, PaginationPageSizeChanger } from './interface';
interface InternalSelectProps extends SelectProps {
/**
@@ -11,16 +11,15 @@ interface InternalSelectProps extends SelectProps {
popupMatchSelectWidth?: boolean;
}
-interface OptionsProps {
+interface OptionsProps
+ extends Partial> {
disabled?: boolean;
locale: PaginationLocale;
rootPrefixCls: string;
selectPrefixCls?: string;
pageSize: number;
- pageSizeOptions?: (string | number)[];
- showSearch?: boolean;
goButton?: boolean | string;
- changeSize?: (size: number) => void;
+ onChange?: (size: number) => void;
quickGo?: (value: number) => void;
buildOptionText?: (value: string | number) => string;
selectComponentClass: React.ComponentType> & {
@@ -32,18 +31,18 @@ const defaultPageSizeOptions = ['10', '20', '50', '100'];
const Options: React.FC = (props) => {
const {
- pageSizeOptions = defaultPageSizeOptions,
locale,
- changeSize,
pageSize,
goButton,
quickGo,
rootPrefixCls,
selectComponentClass: Select,
- showSearch,
selectPrefixCls,
disabled,
buildOptionText,
+ options = defaultPageSizeOptions,
+ onChange,
+ showSearch,
} = props;
const [goInputText, setGoInputText] = React.useState('');
@@ -59,8 +58,8 @@ const Options: React.FC = (props) => {
? buildOptionText
: (value: string) => `${value} ${locale.items_per_page}`;
- const changeSizeHandle = (value: number) => {
- changeSize?.(Number(value));
+ const handleChangeSize = (value: number) => {
+ onChange?.(Number(value));
};
const handleChange = (e: React.ChangeEvent) => {
@@ -94,13 +93,13 @@ const Options: React.FC = (props) => {
const getPageSizeOptions = () => {
if (
- pageSizeOptions.some(
- (option) => option.toString() === pageSize.toString(),
+ options.some(
+ (option: unknown) => option.toString() === pageSize.toString(),
)
) {
- return pageSizeOptions;
+ return options;
}
- return pageSizeOptions.concat([pageSize.toString()]).sort((a, b) => {
+ return options.concat([pageSize.toString()]).sort((a, b) => {
const numberA = Number.isNaN(Number(a)) ? 0 : Number(a);
const numberB = Number.isNaN(Number(b)) ? 0 : Number(b);
return numberA - numberB;
@@ -111,7 +110,7 @@ const Options: React.FC = (props) => {
// ============== render ==============
- if (!changeSize && !quickGo) {
+ if (!onChange && !quickGo) {
return null;
}
@@ -119,8 +118,8 @@ const Options: React.FC = (props) => {
let goInput: React.ReactNode = null;
let gotoButton: React.ReactNode = null;
- if (changeSize && Select) {
- const options = getPageSizeOptions().map((opt, i) => (
+ if (onChange && Select) {
+ const slectOptions = getPageSizeOptions().map((opt, i) => (
{mergeBuildOptionText(opt)}
@@ -134,13 +133,13 @@ const Options: React.FC = (props) => {
className={`${prefixCls}-size-changer`}
optionLabelProp="children"
popupMatchSelectWidth={false}
- value={(pageSize || pageSizeOptions[0]).toString()}
- onChange={changeSizeHandle}
+ value={(pageSize || options[0]).toString()}
+ onChange={handleChangeSize}
getPopupContainer={(triggerNode) => triggerNode.parentNode}
aria-label={locale.page_size}
defaultOpen={false}
>
- {options}
+ {slectOptions}
);
}
diff --git a/src/Pagination.tsx b/src/Pagination.tsx
index 878e91a3..098ff7a7 100644
--- a/src/Pagination.tsx
+++ b/src/Pagination.tsx
@@ -56,7 +56,6 @@ const Pagination: React.FC = (props) => {
showLessItems,
showTitle = true,
onShowSizeChange = noop,
- showSizeOptionsSearch,
locale = zhCN,
style,
totalBoundaryShowSizeChanger = 50,
@@ -65,6 +64,7 @@ const Pagination: React.FC = (props) => {
showTotal,
showSizeChanger: showSizeChangerProp,
pageSizeOptions,
+ pageSizeChanger = {},
// render
itemRender = defaultItemRender,
@@ -94,6 +94,12 @@ const Pagination: React.FC = (props) => {
setInternalInputVal(current);
}, [current]);
+ const {
+ onChange: onPageSizeChange = onShowSizeChange || noop,
+ showSearch,
+ options = pageSizeOptions,
+ } = pageSizeChanger;
+
const hasOnChange = onChange !== noop;
const hasCurrent = 'current' in props;
@@ -188,14 +194,14 @@ const Pagination: React.FC = (props) => {
handleChange(getValidValue(event));
}
- function changePageSize(size: number) {
+ function handlePageSize(size: number) {
const newCurrent = calculatePage(size, pageSize, total);
const nextCurrent =
current > newCurrent && newCurrent !== 0 ? newCurrent : current;
setPageSize(size);
setInternalInputVal(nextCurrent);
- onShowSizeChange?.(current, size);
+ onPageSizeChange?.(current, size);
setCurrent(nextCurrent);
onChange?.(nextCurrent, size);
}
@@ -577,11 +583,11 @@ const Pagination: React.FC = (props) => {
rootPrefixCls={prefixCls}
disabled={disabled}
selectComponentClass={selectComponentClass}
- showSearch={showSizeOptionsSearch}
+ showSearch={showSearch}
selectPrefixCls={selectPrefixCls}
- changeSize={showSizeChanger ? changePageSize : null}
pageSize={pageSize}
- pageSizeOptions={pageSizeOptions}
+ onChange={showSizeChanger ? handlePageSize : null}
+ options={options}
quickGo={shouldDisplayQuickJumper ? handleChange : null}
goButton={gotoButton}
/>
diff --git a/src/interface.ts b/src/interface.ts
index 61954c13..ed8c5c6c 100644
--- a/src/interface.ts
+++ b/src/interface.ts
@@ -1,3 +1,4 @@
+import { SelectProps } from 'rc-select';
import type React from 'react';
export interface PaginationLocale {
@@ -17,10 +18,19 @@ export interface PaginationLocale {
page_size?: string;
}
+export interface PaginationPageSizeChanger
+ extends Pick {
+ options?: string[] | number[];
+ onChange?: (current: number, size: number) => void;
+}
+
export interface PaginationData {
className: string;
selectPrefixCls: string;
prefixCls: string;
+ /**
+ * @deprecated use pageSizeChanger={{options}} instead, will be removed in v4.0.5
+ */
pageSizeOptions: string[] | number[];
current: number;
@@ -32,7 +42,7 @@ export interface PaginationData {
hideOnSinglePage: boolean;
showSizeChanger: boolean;
- showSizeOptionsSearch?: boolean;
+ pageSizeChanger: PaginationPageSizeChanger;
showLessItems: boolean;
showPrevNextJumpers: boolean;
showQuickJumper: boolean | object;
@@ -55,6 +65,9 @@ export interface PaginationProps
extends Partial,
React.AriaAttributes {
onChange?: (page: number, pageSize: number) => void;
+ /**
+ * @deprecated use pageSizeChanger={{onChange}} instead, will be removed in v4.0.5
+ */
onShowSizeChange?: (current: number, size: number) => void;
itemRender?: (
page: number,
diff --git a/tests/sizer.test.tsx b/tests/sizer.test.tsx
index 03649a33..0ad94fcb 100644
--- a/tests/sizer.test.tsx
+++ b/tests/sizer.test.tsx
@@ -74,7 +74,9 @@ describe('Pagination with sizer', () => {
total={500}
pageSize={15}
showSizeChanger
- showSizeOptionsSearch
+ pageSizeChanger={{
+ showSearch: true,
+ }}
selectComponentClass={Select}
/>,
);
@@ -90,7 +92,7 @@ describe('Pagination with sizer', () => {
selectComponentClass={Select}
total={500}
defaultPageSize={20}
- pageSizeOptions={[20, 50]}
+ pageSizeChanger={{ options: [20, 50] }}
/>,
);
expect(