大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯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

 import React, { Component } from 'react'
 import Immutable from 'immutable'
 import _ from 'lodash'

 /* ================================================================================
  * React GrxPagingBar 通用分页组件
  * author: 天真的好蓝啊
  * ================================================================================ */
 class GrxPagingBar extends Component {
     render() {
         var pagingOptions = {
             showNumber: 5,
             firstText: "<<",
             firstTitle: "第一页",
             prevText: "<",
             prevTitle: "上一页",
             beforeTitle: "前",
             afterTitle: "后",
             pagingTitle: "页",
             nextText: ">",
             nextTitle: "下一页",
             lastText: ">>",
             lastTitle: "最后一页",
             classNames: "grx-pagingbar pull-right",
         }

         $.extend(pagingOptions, this.props.pagingOptions)

         return (
             <div className={pagingOptions.classNames} >
                 <GrxPagingFirst {...pagingOptions} {...this.props} />
                 <GrxPagingBeforeAfter isBefore="true" {...pagingOptions} {...this.props} />
                 <GrxPagingList {...pagingOptions} {...this.props} />
                 <GrxPagingBeforeAfter isBefore="false" {...pagingOptions} {...this.props} />
                 <GrxPagingLast {...pagingOptions} {...this.props} />
                 <GrxPagingInfo {...this.props} />
             </div>
         )
     }
 }

 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  * 分页条头组件
  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
 class GrxPagingFirst extends Component {
     render() {
         var ids = []
         let paging = this.props.items.get('Paging')
         let current = paging.get('PagingIndex')
         let pagingIndex = current - 1

         if(paging.get('PagingIndex') != 1){
             ids.push(1)
         }

         let html = ids.map(
             (v,i) =>
             <span>
                 <GrxPagingNumber title={this.props.firstTitle} text={this.props.firstText} pagingIndex={1} {...this.props}/>
                 <GrxPagingNumber title={this.props.prevTitle} text={this.props.prevText} pagingIndex={pagingIndex} {...this.props}/>
             </span>
         )

         return (
             <span className="grx-pagingbar-fl">
                 {html}
             </span>
         )
     }
 }

 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  * 分页条前后页组件
  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
 class GrxPagingBeforeAfter extends Component {
     render() {
         var ids = []
         let isBefore = this.props.isBefore == "true" ? true : false
         let paging = this.props.items.get('Paging')
         let pagingCount = paging.get('PagingCount')
         let current = paging.get('PagingIndex')

         let pagingIndex = isBefore ? current - this.props.showNumber : current + this.props.showNumber
         let title = (isBefore ? this.props.beforeTitle : this.props.afterTitle) + (this.props.showNumber + 1) + this.props.pagingTitle

         if(isBefore && current > this.props.showNumber + 1){
             ids.push(1)
         }else if(!isBefore && current < pagingCount - this.props.showNumber){
             ids.push(1)
         }

         var html = ids.map(
             (v,i) => <a href="###" onClick={this.props.actions.pagingAction.bind(this, pagingIndex)} title={title}>..</a>
         )

         return (
             <span>
                 {html}
             </span>
         )
     }
 }

 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  * 分页条页码列表组件
  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
 class GrxPagingList extends Component {
     render(){
         let paging = this.props.items.get('Paging')
         let count = paging.get('PagingCount')
         let current = paging.get('PagingIndex')
         let start = current - this.props.showNumber
         let end = current + this.props.showNumber

         var pageIndexs = new Array();
         for(var i = start; i < end; i ++) {
             if( i == current){
                 pageIndexs.push(i)
             }else if(i > 0 & i <= count) {
                 pageIndexs.push(i)
             }
         }

         var pagingList = pageIndexs.map(
             (v,i) =>
             current == v ?
             count > 1 ? <span className="grx-pagingbar-current">{v}</span> : ""
             :
             <GrxPagingNumber pagingIndex={v} {...this.props} />
         )

         return(
             <span>
                 {pagingList}
             </span>
         )
     }
 }

 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  * 分页条尾部组件
  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
 class GrxPagingLast extends Component {
     render() {
         var ids = []
         let paging = this.props.items.get('Paging')
         let pagingCount = paging.get('PagingCount')
         let current = paging.get('PagingIndex')
         let pagingIndex = current + 1

         if(paging.get('PagingIndex') < paging.get('PagingCount')){
             ids.push(1)
         }

         let html = ids.map(
             (v,i) =>
             <span>
                 <GrxPagingNumber title={this.props.nextTitle} text={this.props.nextText} pagingIndex={pagingIndex} {...this.props}/>
                 <GrxPagingNumber title={this.props.lastTitle} text={this.props.lastText} pagingIndex={pagingCount} {...this.props} />
             </span>
         )

         return (
             <span className="grx-pagingbar-fl">
                 {html}
             </span>
         )
     }
 }

 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  * 分页页码组件
  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
 class GrxPagingNumber extends Component {
     render(){
         let pagingIndex = this.props.pagingIndex
         let title = "第"+ pagingIndex + this.props.pagingTitle
         let text = pagingIndex

         if(this.props.title){
             title = this.props.title
         }

         if(this.props.text){
             text = this.props.text
         }

         return(
             <a href="###" onClick={this.props.actions.pagingAction.bind(this, pagingIndex)} title={title}> {text} </a>
         )
     }
 }

 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  * 分页条信息组件
  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
 class GrxPagingInfo extends Component {
     render() {
         let paging = this.props.items.get('Paging')
         let pagingIndex = paging.get('PagingIndex')
         let pagingCount = paging.get('PagingCount')
         let totalRecord = paging.get('TotalRecord')
         return (
             <span className="grx-pagingbar-info">第{pagingIndex}/{pagingCount}页,共{totalRecord}条数据</span>
         )
     }
 }

 /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  * 从此模块导出分页条组件
  * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
 export default GrxPagingBar

使用方法:

 import React, { Component } from 'react'
 import _ from 'lodash'
 import classNames from 'classnames'
 import PagingBar from '.paging-bar'

 /* ================================================================================
  * React PagingBar使用范例组件
  * ================================================================================ */
 class PagingBarExample extends Component {
     render() {
         let pagingOptions = {
             showNumber: 3
         }

         return (
             <table className="table table-condensed">
                 <tbody>
                     <tr>
                         <td>
                             <PagingBar pagingOptions={pagingOptions} {...this.props} />
                         </td>
                     </tr>
                 </tbody>
             </table>
         )
     }
 }

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

 package commons

 import (
     "math"
 )

 type (
     Paging struct {
         PagingIndex int64
         PagingSize  int64
         TotalRecord int64
         PagingCount int64
         Sortorder   string
     }
 )

 func (paging *Paging) SetTotalRecord(totalRecord int64) {
     //paging.PagingIndex = 1
     paging.PagingCount =
      {
         paging.TotalRecord = totalRecord
         paging.PagingCount = int64(math.Ceil(float64(paging.TotalRecord) / float64(paging.PagingSize)))
     }
 }

 func (paging *Paging) Offset() int64 {
      || paging.PagingSize ==  {

     }

     offset := (paging.PagingIndex * paging.PagingSize) - paging.PagingSize + 

     return offset
 }

 func (paging *Paging) EndIndex() int64 {
      {
         return paging.PagingSize
     }

     offset := paging.PagingIndex * paging.PagingSize

     return offset
 }

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

ReactJS实现的通用分页组件的更多相关文章

  1. asp.net MVC通用分页组件 使用方便 通用性强

    asp.net MVC通用分页组件 使用方便 通用性强   该分页控件的显示逻辑: 1 当前页面反色突出显示,链接不可点击 2 第一页时首页链接不可点击 3 最后一页时尾页链接不可点击 4 当前页面左 ...

  2. 基于Vue的简单通用分页组件

    分页组件是每一个系统里必不可少的一个组件,分页组件分为两部分.第一部分是模版部分,用于显示当前分页组件的状态,例如正在获取数据.没有数据.没有下一页等等:第二部分是分页数据对象,用于封装一个分页组件的 ...

  3. 详解分页组件中查count总记录优化

    1 背景 研究mybatis-plus(以下简称MBP),使用其分页功能时.发现了一个JsqlParserCountOptimize的分页优化处理类,官方对其未做详细介绍,网上也未找到分析该类逻辑的只 ...

  4. Mvc分页组件MvcSimplePager代码重构

    1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...

  5. Mvc分页组件MvcSimplePager代码重构及使用

    1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...

  6. vuejs2.0实现分页组件,使用$emit进行事件监听数据传递

    上一篇文章介绍了vuejs实现的简单分页,如果我有几个页面都需要有分页效果,不可能每个页面都去复制一下这段代码吧,意思是封装一下,变成通用的组件. 首先使用基础 Vue 构造器,创建一个“子类”,Vu ...

  7. SNF快速开发平台MVC-瀑布式分页组件

    1.   瀑布式分页 目前已经比较流行了,以往的这种点击分页已经不能满足广大网民的需求了.像百度图片等等,网站都有滚动滚轮直接分页的功能,这样体验也确实好了不少,所以我们也决定在我们的框架内进行集成此 ...

  8. 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...

  9. 基于Vue.js的表格分页组件

    有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋 ...

随机推荐

  1. jquery阻止元素冒泡的两种方法

    通常情况下,如果给父元素添加事件之后,子元素也会继承同样的事件,这个时候就要阻止子元素的这种行为,成为阻止冒泡,总结两种解决方法: html代码: <div id="parent&qu ...

  2. 【转】mysql查询结果输出到文件

    转自:http://www.cnblogs.com/emanlee/p/4233602.html mysql查询结果导出/输出/写入到文件 方法一: 直接执行命令: mysql> select ...

  3. hihocoder-平衡树·SBT

    http://hihocoder.com/problemset/problem/1337 #1337 : 平衡树·SBT 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 ...

  4. 即时聊天IM之三 XMPP协议客户端库的和Android端框架概述

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com smack ...

  5. 前端常用的几个js判断(一)

    1. 禁止右键点击$(document).ready(function(){ $(document).bind("contextmenu",function(e){ return ...

  6. shell算数运算

    ((i=$j+$k))    等价于 i=`expr $j + $k`((i=$j-$k))     等价于   i=`expr $j -$k`((i=$j*$k))     等价于   i=`exp ...

  7. C++ 标准库string字符串的截取

    标准库的string有一个substr函数用来截取子字符串.一般使用时传入两个参数,第一个是开始的坐标(第一个字符是0),第二个是截取的长度. #include <iostream> #i ...

  8. Linux系统的初化始配置(包括配置网络,修改主机名,关闭firewalld与selinux的生效)

    一.配置网络环境 1.运行 cmd 查看本机的ip地址,然后记录下来. 2.网络和共享中心--本地连接属性如下: 手工配置到本地连接上面 IP:172.16.191.215,DNS:101.7.8.9 ...

  9. UEditor手动调节其宽度

    其高度一般不考虑,给个初始高度,然后任其自动扩展就行,对于其宽度,有两种思路,一种是调节其所在的DIV的宽度,让其自动填充,另一种是直接调节编辑器的宽度: adjust_editor_size: fu ...

  10. 递归算法(三)——多项分布问题

    问题 一个枪手打靶,靶从外向内有1-10分(考虑脱靶得0分),打十枪,求枪手最后得90分的概率. 解决思路 一.穷举 考虑10重for循环,累计十次得分和为90者,求得概率.该法通用性差,效率低,但容 ...