自己寫一個 react 分頁組件(PageComponent )


由於項目需要,到網上找了一下,卻發現都是過於復雜,沒有合適的。所以只能自行寫嘗試着寫了一個。

具體要求:

  一、參數只傳總頁數,當前頁碼,回調方法。

  二、選擇頁碼后回調選中的頁碼,並高亮顯示。

  三、如果當前頁碼為第一頁,則沒有【上一頁】,如果當前頁為最后一頁則沒有【下一頁】

  四、總頁碼小於等於10時,把全部頁碼顯示出來

  五、如總頁碼數大於10時,顯示省略頁碼

大體效果如圖:

下面放上源碼:

page.scss
 1 /*css -scss/less */
 2 .g-page {
 3     display: inline-block;
 4     *display: inline;
 5     *zoom: 1;
 6     vertical-align: middle;
 7     margin: 10px 0;
 8     font-size: 0;
 9 
10     li {
11         display: inline-block;
12         *display: inline;
13         *zoom: 1;
14         vertical-align: middle;
15         padding: 0 15px;
16         height: 28px;
17         line-height: 28px;
18         margin: 0 -1px 5px 0;
19         background-color: #fff;
20         color: #333;
21         font-size: 12px;
22         border: 1px solid #e2e2e2;
23         cursor: pointer;
24         &:hover{
25             color: #009688;
26         }
27     }
28     .activePage{
29         background-color: #009688;
30         color: #fff;
31         &:hover{
32             color: #fff;
33         }
34     }
35 }

Pagecomponent.js

 1 import React, { Component } from 'react'
 2 import './page.scss';
 3 export default class Pagecomponent extends Component {
 4     constructor(props) {
 5         super(props)
 6         this.state = {
 7             currentPage: 1, //當前頁碼
 8             groupCount: 5, //頁碼分組,顯示7個頁碼,其余用省略號顯示
 9             startPage: 1,  //分組開始頁碼
10             totalPage: 1 //總頁數
11         }
12     }
13     // 點擊頁碼
14     pageClick(currentPage) {
15         const { groupCount } = this.state
16         const getCurrentPage = this.props.pageCallbackFn;
17         //當 當前頁碼 大於 分組的頁碼 時,使 當前頁 前面 顯示 兩個頁碼
18         let startPage = currentPage >= groupCount ? currentPage - 2: 1
19         this.setState({
20             startPage,
21             currentPage
22         })
23         //將當前頁碼返回父組件
24         getCurrentPage(currentPage)
25     }
26     //上一頁事件
27     prePageHandeler() {
28         let { currentPage } = this.state
29         this.pageClick(--currentPage)
30     }
31     //下一頁事件
32     nextPageHandeler() {
33         let { currentPage } = this.state
34         this.pageClick(++currentPage)
35     }
36     // 獲取從父組件傳來的總頁數與當前頁數
37     componentDidMount(){
38         this.setState({
39             currentPage:this.props.currentPage,
40             totalPage:this.props.totalPage
41         })
42     }
43     render() {
44         const {groupCount, startPage,currentPage, totalPage} = this.state;
45         let pages = []
46 
47         // 如果當前面不是第一頁 則添加上一頁
48         if(currentPage!==1){
49             pages.push(<li onClick={this.prePageHandeler.bind(this)} key={0}> 上一頁</li>)
50         }
51 
52          /*總頁碼小於等於10時,全部顯示出來*/
53         if (totalPage <= 10) {
54             for (let i = 1; i <= totalPage; i++) {
55                 pages.push(<li key={i} onClick={this.pageClick.bind(this, i)}
56                     className={currentPage === i ? "activePage" : null}>{i}</li>)
57             }
58         } else {/*總頁碼大於10時,部分顯示*/
59 
60             //第一頁
61             pages.push(<li className={currentPage === 1 ? "activePage" : null} key={1}
62                 onClick={this.pageClick.bind(this, 1)}>1</li>)
63 
64             //前面省略號(當當前頁碼比分組的頁碼大時顯示省略號)
65             if (currentPage >= groupCount) {
66                 pages.push(<li className="" key={-1}>···</li>)
67             }
68             //非第一頁和最后一頁顯示
69             for (let i = currentPage-2; i < currentPage+3; i++) {
70                 if (i <= totalPage - 1 && i > 1) {
71                     pages.push(<li className={currentPage === i ? "activePage" : null} key={i}
72                         onClick={this.pageClick.bind(this, i)}>{i}</li>)
73                 }
74             }
75             //后面省略號
76             if (totalPage - startPage >= groupCount + 1) {
77                 pages.push(<li className="" key={-2}>···</li>)
78             }
79             //最后一頁
80             pages.push(<li className={currentPage === totalPage ? "activePage" : null} key={totalPage}
81                 onClick={this.pageClick.bind(this, totalPage)}>{totalPage}</li>)
82         }
83 
84         //如果當前面不是最后一頁 則添加下一頁
85         if(currentPage!==totalPage){
86             pages.push(<li onClick={this.nextPageHandeler.bind(this)} key={totalPage + 1}>下一頁</li>)
87         }
88         return (
89             <ul className="g-page">
90                { pages}
91             </ul>
92         )
93     }
94 }

 組件調用 核心代碼

getCurrentPage(currentPage) {
        console.log('currentPage', currentPage)
    }

<Pagecomponent pageCallbackFn={this.getCurrentPage.bind(this)} totalPage={20} currentPage={5}></Pagecomponent>

 到這,分頁組件就差不多寫好了,能用了 。當然還不夠嚴謹,像還沒對傳的參數進行校驗。有興趣的朋友可以自己加上去

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM