码迷,mamicode.com
首页 > Web开发 > 详细

ReactJS实现的通用分页组件

时间:2015-12-28 12:17:12      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:

    大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯jsWeb板的,Angular版的,因为这个基础得不能再基础的功能太多地方都会用到,下面我给出以个用ReactJS实现的版本,首先上图看下效果:
    技术分享

    注意这个组件需要ES6环境,最好使用NodeJS结合Webpack来打包:webpack --display-error-details --config webpack.config.js

    此React版分页组件请亲们结合redux来使用比较方便,UI = Fn(State)
    基本流程就是:用户交互->Action->Reduce->Store->UIRender

    了解以上基础知识却非常必要,但不是我此次要说的重点,以上相关知识请各位自行补脑,废话就不多说,直接上代码。

   filename: paging-bar.js

  1 import React, { Component } from ‘react‘
  2 import Immutable from ‘immutable‘
  3 import _ from ‘lodash‘
  4 
  5 /* ================================================================================
  6  * React GrxPagingBar 通用分页组件
  7  * author: 天真的好蓝啊
  8  * ================================================================================ */
  9 class GrxPagingBar extends Component {
 10     render() {
 11         var pagingOptions = {
 12             showNumber: 5,
 13             firstText: "<<",
 14             firstTitle: "第一页",
 15             prevText: "<",
 16             prevTitle: "上一页",
 17             beforeTitle: "前",
 18             afterTitle: "后",
 19             pagingTitle: "页",
 20             nextText: ">",
 21             nextTitle: "下一页",
 22             lastText: ">>",
 23             lastTitle: "最后一页",
 24             classNames: "grx-pagingbar pull-right",
 25         }
 26         
 27         $.extend(pagingOptions, this.props.pagingOptions)
 28 
 29         return (
 30             <div className={pagingOptions.classNames} >
 31                 <GrxPagingFirst {...pagingOptions} {...this.props} />
 32                 <GrxPagingBeforeAfter isBefore="true" {...pagingOptions} {...this.props} />
 33                 <GrxPagingList {...pagingOptions} {...this.props} />
 34                 <GrxPagingBeforeAfter isBefore="false" {...pagingOptions} {...this.props} />
 35                 <GrxPagingLast {...pagingOptions} {...this.props} />
 36                 <GrxPagingInfo {...this.props} />
 37             </div>
 38         )
 39     }
 40 }
 41 
 42 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 43  * 分页条头组件
 44  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
 45 class GrxPagingFirst extends Component {
 46     render() {
 47         var ids = []
 48         let paging = this.props.items.get(‘Paging‘)
 49         let current = paging.get(‘PagingIndex‘)
 50         let pagingIndex = current - 1
 51 
 52         if(paging.get(‘PagingIndex‘) != 1){
 53             ids.push(1)
 54         }
 55 
 56         let html = ids.map(
 57             (v,i) => 
 58             <span>
 59                 <GrxPagingNumber title={this.props.firstTitle} text={this.props.firstText} pagingIndex={1} {...this.props}/>
 60                 <GrxPagingNumber title={this.props.prevTitle} text={this.props.prevText} pagingIndex={pagingIndex} {...this.props}/>
 61             </span>
 62         )
 63         
 64         return (
 65             <span className="grx-pagingbar-fl">
 66                 {html}
 67             </span>
 68         )
 69     }
 70 }
 71 
 72 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 73  * 分页条前后页组件
 74  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
 75 class GrxPagingBeforeAfter extends Component {
 76     render() {
 77         var ids = []
 78         let isBefore = this.props.isBefore == "true" ? true : false
 79         let paging = this.props.items.get(‘Paging‘)
 80         let pagingCount = paging.get(‘PagingCount‘)
 81         let current = paging.get(‘PagingIndex‘)
 82         
 83         let pagingIndex = isBefore ? current - this.props.showNumber : current + this.props.showNumber
 84         let title = (isBefore ? this.props.beforeTitle : this.props.afterTitle) + (this.props.showNumber + 1) + this.props.pagingTitle
 85 
 86         if(isBefore && current > this.props.showNumber + 1){
 87             ids.push(1)
 88         }else if(!isBefore && current < pagingCount - this.props.showNumber){
 89             ids.push(1)
 90         }
 91 
 92         var html = ids.map(
 93             (v,i) => <a href="###" onClick={this.props.actions.pagingAction.bind(this, pagingIndex)} title={title}>..</a>
 94         )
 95 
 96         return (
 97             <span>
 98                 {html}
 99             </span>
100         )
101     }
102 }
103 
104 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
105  * 分页条页码列表组件
106  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
107 class GrxPagingList extends Component {
108     render(){
109         let paging = this.props.items.get(‘Paging‘)
110         let count = paging.get(‘PagingCount‘)
111         let current = paging.get(‘PagingIndex‘)
112         let start = current - this.props.showNumber
113         let end = current + this.props.showNumber
114 
115         var pageIndexs = new Array();
116         for(var i = start; i < end; i ++) {
117             if( i == current){
118                 pageIndexs.push(i)
119             }else if(i > 0 & i <= count) {
120                 pageIndexs.push(i)
121             }
122         }
123 
124         var pagingList = pageIndexs.map(
125             (v,i) => 
126             current == v ? 
127             count > 1 ? <span className="grx-pagingbar-current">{v}</span> : ""
128             : 
129             <GrxPagingNumber pagingIndex={v} {...this.props} />
130         )
131 
132         return(
133             <span>
134                 {pagingList}
135             </span>
136         )
137     }
138 }
139 
140 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
141  * 分页条尾部组件
142  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
143 class GrxPagingLast extends Component {
144     render() {
145         var ids = []
146         let paging = this.props.items.get(‘Paging‘)
147         let pagingCount = paging.get(‘PagingCount‘)
148         let current = paging.get(‘PagingIndex‘)
149         let pagingIndex = current + 1
150 
151         if(paging.get(‘PagingIndex‘) < paging.get(‘PagingCount‘)){
152             ids.push(1)
153         }
154 
155         let html = ids.map(
156             (v,i) => 
157             <span>
158                 <GrxPagingNumber title={this.props.nextTitle} text={this.props.nextText} pagingIndex={pagingIndex} {...this.props}/>
159                 <GrxPagingNumber title={this.props.lastTitle} text={this.props.lastText} pagingIndex={pagingCount} {...this.props} />
160             </span>
161         )
162 
163         return (
164             <span className="grx-pagingbar-fl">
165                 {html}
166             </span>
167         )
168     }
169 }
170 
171 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
172  * 分页页码组件
173  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
174 class GrxPagingNumber extends Component {
175     render(){
176         let pagingIndex = this.props.pagingIndex
177         let title = "第"+ pagingIndex + this.props.pagingTitle
178         let text = pagingIndex
179 
180         if(this.props.title){
181             title = this.props.title
182         }
183 
184         if(this.props.text){
185             text = this.props.text
186         }
187 
188         return(
189             <a href="###" onClick={this.props.actions.pagingAction.bind(this, pagingIndex)} title={title}> {text} </a>
190         )
191     }
192 }
193 
194 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
195  * 分页条信息组件
196  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
197 class GrxPagingInfo extends Component {
198     render() {
199         let paging = this.props.items.get(‘Paging‘)
200         let pagingIndex = paging.get(‘PagingIndex‘)
201         let pagingCount = paging.get(‘PagingCount‘)
202         let totalRecord = paging.get(‘TotalRecord‘)
203         return (
204             <span className="grx-pagingbar-info">第{pagingIndex}/{pagingCount}页,共{totalRecord}条数据</span>
205         )
206     }
207 }
208 
209 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
210  * 从此模块导出分页条组件
211  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
212 export default GrxPagingBar

 

使用方法:

 1 import React, { Component } from ‘react‘
 2 import _ from ‘lodash‘
 3 import classNames from ‘classnames‘
 4 import PagingBar from ‘.paging-bar‘
 5 
 6 /* ================================================================================
 7  * React PagingBar使用范例组件
 8  * ================================================================================ */
 9 class PagingBarExample extends Component {
10     render() {
11         let pagingOptions = {
12             showNumber: 3
13         }
14 
15         return (
16             <table className="table table-condensed">
17                 <tbody>
18                     <tr>
19                         <td>
20                             <PagingBar pagingOptions={pagingOptions} {...this.props} />
21                         </td>
22                     </tr>
23                 </tbody>
24             </table>
25         )
26     }
27 }

 

附上Paging这个分页数据对象的结构paging.go服务端的Data Struct:

 1 package commons
 2 
 3 import (
 4     "math"
 5 )
 6 
 7 type (
 8     Paging struct {
 9         PagingIndex int64
10         PagingSize  int64
11         TotalRecord int64
12         PagingCount int64
13         Sortorder   string
14     }
15 )
16 
17 func (paging *Paging) SetTotalRecord(totalRecord int64) {
18     //paging.PagingIndex = 1
19     paging.PagingCount = 0
20     if totalRecord > 0 {
21         paging.TotalRecord = totalRecord
22         paging.PagingCount = int64(math.Ceil(float64(paging.TotalRecord) / float64(paging.PagingSize)))
23     }
24 }
25 
26 func (paging *Paging) Offset() int64 {
27     if paging.PagingIndex <= 1 || paging.PagingSize == 0 {
28         return 0
29     }
30 
31     offset := (paging.PagingIndex * paging.PagingSize) - paging.PagingSize + 1
32 
33     return offset
34 }
35 
36 func (paging *Paging) EndIndex() int64 {
37     if paging.PagingIndex <= 1 {
38         return paging.PagingSize
39     }
40 
41     offset := paging.PagingIndex * paging.PagingSize
42 
43     return offset
44 }

 


感谢园子里的亲们,2016新年快乐*_^。

 

ReactJS实现的通用分页组件

标签:

原文地址:http://www.cnblogs.com/CHONGCHONG2008/p/react-pagingbar.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!