質問編集履歴

1

コードの間違い

2018/10/04 00:47

投稿

sixth13
sixth13

スコア33

test CHANGED
File without changes
test CHANGED
@@ -110,73 +110,289 @@
110
110
 
111
111
  import React from 'react';
112
112
 
113
- import Pagination from './Pagination';
114
-
115
-
116
-
117
- class App extends React.Component {
118
-
119
- constructor() {
120
-
121
- super();
122
-
123
-
124
-
125
- // an example array of items to be paged
126
-
127
- var exampleItems = [...Array(150).keys()].map(i => ({ id: (i+1), name: 'Item ' + (i+1) }));
128
-
129
-
130
-
131
- this.state = {
132
-
133
- exampleItems: exampleItems,
134
-
135
- pageOfItems: []
113
+ import PropTypes from 'prop-types';
114
+
115
+ import { BrowserRouter, Route, Link } from 'react-router-dom'
116
+
117
+
118
+
119
+ const propTypes = {
120
+
121
+ items: PropTypes.array.isRequired,
122
+
123
+ onChangePage: PropTypes.func.isRequired,
124
+
125
+ initialPage: PropTypes.number,
126
+
127
+ pageSize: PropTypes.number,
128
+
129
+ currentPage: PropTypes.number
130
+
131
+ }
132
+
133
+
134
+
135
+ const defaultProps = {
136
+
137
+ initialPage: 1,
138
+
139
+ pageSize: 10
140
+
141
+ }
142
+
143
+
144
+
145
+ class Pagination extends React.Component {
146
+
147
+ constructor(props) {
148
+
149
+ super(props);
150
+
151
+ this.state = { pager: {} };
152
+
153
+ const reg = /\d+$/;
154
+
155
+ const url = String(location.href)
156
+
157
+ const notInitialPage = reg.test(url)
158
+
159
+ // currentPage = url.match(reg)[0]
160
+
161
+ // console.log(currentPage)
162
+
163
+ }
164
+
165
+
166
+
167
+ componentWillMount() {
168
+
169
+ // set page if items array isn't empty
170
+
171
+ if (this.props.items && this.props.items.length) {
172
+
173
+ this.setPage(this.props.initialPage);
174
+
175
+ }
176
+
177
+ }
178
+
179
+
180
+
181
+ componentDidUpdate(prevProps, prevState) {
182
+
183
+ // reset page if items array has changed
184
+
185
+ if (this.props.items !== prevProps.items) {
186
+
187
+ this.setPage(this.props.initialPage);
188
+
189
+ }
190
+
191
+ }
192
+
193
+
194
+
195
+ setPage(page) {
196
+
197
+ var { items, pageSize } = this.props;
198
+
199
+ var pager = this.state.pager;
200
+
201
+
202
+
203
+ if (page < 1 || page > pager.totalPages) {
204
+
205
+ return;
206
+
207
+ }
208
+
209
+
210
+
211
+ // get new pager object for specified page
212
+
213
+ pager = this.getPager(items.length, page, pageSize);
214
+
215
+
216
+
217
+ // get new page of items from items array
218
+
219
+ var pageOfItems = items.slice(pager.startIndex, pager.endIndex + 1);
220
+
221
+
222
+
223
+ // update state
224
+
225
+ this.setState({ pager: pager });
226
+
227
+
228
+
229
+ // call change page function in parent component
230
+
231
+ this.props.onChangePage(pageOfItems);
232
+
233
+ }
234
+
235
+
236
+
237
+ getPager(totalItems, currentPage, pageSize) {
238
+
239
+ // default to first page
240
+
241
+ currentPage = currentPage || 1;
242
+
243
+
244
+
245
+ // default page size is 10
246
+
247
+ pageSize = pageSize || 10;
248
+
249
+
250
+
251
+ // calculate total pages
252
+
253
+ var totalPages = Math.ceil(totalItems / pageSize);
254
+
255
+
256
+
257
+ var startPage, endPage;
258
+
259
+ if (totalPages <= 10) {
260
+
261
+ // less than 10 total pages so show all
262
+
263
+ startPage = 1;
264
+
265
+ endPage = totalPages;
266
+
267
+ } else {
268
+
269
+ // more than 10 total pages so calculate start and end pages
270
+
271
+ if (currentPage <= 6) {
272
+
273
+ startPage = 1;
274
+
275
+ endPage = 10;
276
+
277
+ } else if (currentPage + 4 >= totalPages) {
278
+
279
+ startPage = totalPages - 9;
280
+
281
+ endPage = totalPages;
282
+
283
+ } else {
284
+
285
+ startPage = currentPage - 5;
286
+
287
+ endPage = currentPage + 4;
288
+
289
+ }
290
+
291
+ }
292
+
293
+
294
+
295
+ // calculate start and end item indexes
296
+
297
+ var startIndex = (currentPage - 1) * pageSize;
298
+
299
+ var endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1);
300
+
301
+
302
+
303
+ // create an array of pages to ng-repeat in the pager control
304
+
305
+ var pages = [...Array((endPage + 1) - startPage).keys()].map(i => startPage + i);
306
+
307
+
308
+
309
+ // return object with all pager properties required by the view
310
+
311
+ return {
312
+
313
+ totalItems: totalItems,
314
+
315
+ currentPage: currentPage,
316
+
317
+ pageSize: pageSize,
318
+
319
+ totalPages: totalPages,
320
+
321
+ startPage: startPage,
322
+
323
+ endPage: endPage,
324
+
325
+ startIndex: startIndex,
326
+
327
+ endIndex: endIndex,
328
+
329
+ pages: pages
136
330
 
137
331
  };
138
332
 
139
-
140
-
141
- this.onChangePage = this.onChangePage.bind(this);
142
-
143
- }
144
-
145
-
146
-
147
- onChangePage(pageOfItems) {
148
-
149
- // update state with new page of items
150
-
151
- this.setState({ pageOfItems: pageOfItems });
152
-
153
333
  }
154
334
 
155
335
 
156
336
 
157
337
  render() {
158
338
 
339
+ var pager = this.state.pager;
340
+
341
+
342
+
343
+ if (!pager.pages || pager.pages.length <= 1) {
344
+
345
+ // don't display pager if there is only 1 page
346
+
347
+ return null;
348
+
349
+ }
350
+
351
+
352
+
159
353
  return (
160
354
 
161
- <div>
355
+ <BrowserRouter>
162
-
356
+
163
- <div className="container">
357
+ <ul className="pagination">
164
-
358
+
165
- <div className="text-center">
359
+ <li className={pager.currentPage === 1 ? 'disabled' : ''}>
166
-
167
- {this.state.pageOfItems.map(item =>
360
+
168
-
169
- <div key={item.id}>{item.name}</div>
361
+ <a onClick={() => this.setPage(1)}>First</a>
362
+
170
-
363
+ </li>
364
+
365
+ <li className={pager.currentPage === 1 ? 'disabled' : ''}>
366
+
367
+ <a onClick={() => this.setPage(pager.currentPage - 1)}>Previous</a>
368
+
369
+ </li>
370
+
371
+ {pager.pages.map((page, index) =>
372
+
373
+ <li key={index} className={pager.currentPage === page ? 'active' : ''}>
374
+
375
+ <Link to={page.toString()} onClick={() => this.setPage(page)}>{page}</Link>
376
+
377
+ </li>
378
+
171
- )}
379
+ )}
380
+
172
-
381
+ <li className={pager.currentPage === pager.totalPages ? 'disabled' : ''}>
382
+
173
- <Pagination items={this.state.exampleItems} onChangePage={this.onChangePage} />
383
+ <a onClick={() => this.setPage(pager.currentPage + 1)}>Next</a>
174
-
384
+
175
- </div>
385
+ </li>
386
+
176
-
387
+ <li className={pager.currentPage === pager.totalPages ? 'disabled' : ''}>
388
+
389
+ <a onClick={() => this.setPage(pager.totalPages)}>Last</a>
390
+
177
- </div>
391
+ </li>
178
-
392
+
179
- </div>
393
+ </ul>
394
+
395
+ </BrowserRouter>
180
396
 
181
397
  );
182
398
 
@@ -186,7 +402,11 @@
186
402
 
187
403
 
188
404
 
405
+ Pagination.propTypes = propTypes;
406
+
407
+ Pagination.defaultProps = defaultProps;
408
+
189
- export default App;
409
+ export default Pagination;
190
410
 
191
411
  ```
192
412