Skip to content

Commit a262ee7

Browse files
authored
feat: improve PageSizeOptions with custom pageSize (#270)
* feat: improve PageSizeOptions with custom pageSize * Add tests/sizer.test.js
1 parent da77861 commit a262ee7

File tree

3 files changed

+70
-6
lines changed

3 files changed

+70
-6
lines changed

examples/sizer.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'rc-select/assets/index.less';
77

88
class App extends React.Component {
99
state = {
10-
pageSize: 10,
10+
pageSize: 15,
1111
};
1212

1313
onShowSizeChange = (current, pageSize) => {
@@ -16,34 +16,35 @@ class App extends React.Component {
1616
};
1717

1818
render() {
19+
const { pageSize } = this.state;
1920
return (
2021
<div style={{ margin: 10 }}>
2122
<Pagination
2223
selectComponentClass={Select}
2324
showSizeChanger
24-
pageSize={this.state.pageSize}
25+
pageSize={pageSize}
2526
onShowSizeChange={this.onShowSizeChange}
2627
defaultCurrent={3}
2728
total={40}
2829
/>
2930
<Pagination
3031
selectComponentClass={Select}
31-
pageSize={this.state.pageSize}
32+
pageSize={pageSize}
3233
onShowSizeChange={this.onShowSizeChange}
3334
defaultCurrent={3}
3435
total={50}
3536
/>
3637
<Pagination
3738
selectComponentClass={Select}
38-
pageSize={this.state.pageSize}
39+
pageSize={pageSize}
3940
onShowSizeChange={this.onShowSizeChange}
4041
defaultCurrent={3}
4142
total={60}
4243
/>
4344
<Pagination
4445
selectComponentClass={Select}
4546
showSizeChanger={false}
46-
pageSize={this.state.pageSize}
47+
pageSize={pageSize}
4748
onShowSizeChange={this.onShowSizeChange}
4849
defaultCurrent={3}
4950
total={60}

src/Options.jsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,26 @@ class Options extends React.Component {
5757
}
5858
};
5959

60-
render() {
60+
getPageSizeOptions() {
6161
const {
6262
pageSize,
6363
pageSizeOptions,
64+
} = this.props;
65+
if (pageSizeOptions.some(option => option.toString() === pageSize.toString())) {
66+
return pageSizeOptions;
67+
}
68+
return pageSizeOptions.concat([pageSize.toString()]).sort((a, b) => {
69+
// eslint-disable-next-line no-restricted-globals
70+
const numberA = isNaN(Number(a)) ? 0 : Number(a);
71+
// eslint-disable-next-line no-restricted-globals
72+
const numberB = isNaN(Number(b)) ? 0 : Number(b);
73+
return numberA - numberB;
74+
});
75+
}
76+
77+
render() {
78+
const {
79+
pageSize,
6480
locale,
6581
rootPrefixCls,
6682
changeSize,
@@ -82,6 +98,8 @@ class Options extends React.Component {
8298
return null;
8399
}
84100

101+
const pageSizeOptions = this.getPageSizeOptions();
102+
85103
if (changeSize && Select) {
86104
const options = pageSizeOptions.map((opt, i) => (
87105
<Select.Option key={i} value={opt}>

tests/sizer.test.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import React from 'react';
2+
import { mount } from 'enzyme';
3+
import Select from 'rc-select';
4+
import Pagination from '../src';
5+
6+
describe('Pagination with sizer', () => {
7+
it('should merge custom pageSize to pageSizeOptions', () => {
8+
const wrapper = mount(
9+
<Pagination
10+
total={500}
11+
pageSize={15}
12+
showSizeChanger
13+
selectComponentClass={Select}
14+
/>,
15+
);
16+
wrapper.find(Select).find('input').simulate('mousedown');
17+
expect(wrapper.find(Select).find('.rc-select-item').length).toBe(5);
18+
});
19+
20+
it('should not merge duplicated pageSize to pageSizeOptions', () => {
21+
const wrapper = mount(
22+
<Pagination
23+
total={500}
24+
pageSize={20}
25+
showSizeChanger
26+
selectComponentClass={Select}
27+
/>,
28+
);
29+
wrapper.find(Select).find('input').simulate('mousedown');
30+
expect(wrapper.find(Select).find('.rc-select-item').length).toBe(4);
31+
});
32+
33+
it('should merge pageSize to pageSizeOptions with proper order', () => {
34+
const wrapper = mount(
35+
<Pagination
36+
total={500}
37+
pageSize={45}
38+
showSizeChanger
39+
selectComponentClass={Select}
40+
/>,
41+
);
42+
wrapper.find(Select).find('input').simulate('mousedown');
43+
expect(wrapper.find(Select).find('.rc-select-item').at(2).text()).toBe('45 条/页✓');
44+
});
45+
});

0 commit comments

Comments
 (0)