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(