由於項目需要,到網上找了一下,卻發現都是過於復雜,沒有合適的。所以只能自行寫嘗試着寫了一個。
具體要求:
一、參數只傳總頁數,當前頁碼,回調方法。
二、選擇頁碼后回調選中的頁碼,並高亮顯示。
三、如果當前頁碼為第一頁,則沒有【上一頁】,如果當前頁為最后一頁則沒有【下一頁】
四、總頁碼小於等於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>
到這,分頁組件就差不多寫好了,能用了 。當然還不夠嚴謹,像還沒對傳的參數進行校驗。有興趣的朋友可以自己加上去