首页 > 编程 > JavaScript > 正文

Reactjs实现通用分页组件的实例代码

2019-11-19 17:52:08
字体:
来源:转载
供稿:网友

大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯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 commonsimport ( "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 = 0 if totalRecord > 0 {  paging.TotalRecord = totalRecord  paging.PagingCount = int64(math.Ceil(float64(paging.TotalRecord) / float64(paging.PagingSize))) }}func (paging *Paging) Offset() int64 { if paging.PagingIndex <= 1 || paging.PagingSize == 0 {  return 0 } offset := (paging.PagingIndex * paging.PagingSize) - paging.PagingSize + 1 return offset}func (paging *Paging) EndIndex() int64 { if paging.PagingIndex <= 1 {  return paging.PagingSize } offset := paging.PagingIndex * paging.PagingSize return offset}

以上所述是小编给大家介绍的Reactjs实现通用分页组件的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表